Os objetos de negócios devem poder criar seus próprios DTOs?

Suponha que eu tenha a seguinte classe:

class Camera
{
    public Camera(
        double exposure,
        double brightness,
        double contrast,
        RegionOfInterest regionOfInterest)
    {
        this.exposure = exposure;
        this.brightness = brightness;
        this.contrast = contrast;
        this.regionOfInterest = regionOfInterest;
    }

    public void ConfigureAcquisitionFifo(IAcquisitionFifo acquisitionFifo)
    {
        // do stuff to the acquisition FIFO
    }

    readonly double exposure;
    readonly double brightness;
    readonly double contrast;
    readonly RegionOfInterest regionOfInterest;
}

... e um DTO para transportar as informações da câmera através de um limite de serviço (WCF), por exemplo, para exibição em um aplicativo WinForms / WPF / Web:

using System.Runtime.Serialization;

[DataContract]
public class CameraData
{
    [DataMember]
    public double Exposure { get; set; }

    [DataMember]
    public double Brightness { get; set; }

    [DataMember]
    public double Contrast { get; set; }

    [DataMember]
    public RegionOfInterestData RegionOfInterest { get; set; }
}

Agora eu posso adicionar um método paraCamera para expor seus dados:

class Camera
{
    // blah blah

    public CameraData ToData()
    {
        var regionOfInterestData = regionOfInterest.ToData();

        return new CameraData()
        {
            Exposure = exposure,
            Brightness = brightness,
            Contrast = contrast,
            RegionOfInterest = regionOfInterestData
        };
    }
}

ou, Posso criar um método que exija a transferência de um IReporter especial para a Câmera expor seus dados. Isso remove a dependência da camada Contratos (a câmera não precisa mais saber sobre o CameraData):

class Camera
{
    // beep beep I'm a jeep

    public void ExposeToReporter(IReporter reporter)
    {
        reporter.GetCameraInfo(exposure, brightness, contrast, regionOfInterest);
    }
}

Então, o que devo fazer? Prefiro o segundo, mas exige que o IReporter tenha um campo CameraData (que é alterado porGetCameraInfo()), o que parece estranho. Além disso, se houver uma solução ainda melhor, compartilhe comigo! Eu ainda sou um newb orientado a objetos.

questionAnswers(5)

yourAnswerToTheQuestion