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.