Я бы вообще сказал нет , они не должны этого делать, потому что DTO специфичны для службы или приложения, в то время как модель предметной области является вашим «самым внутренним» уровнем и не должна иметь никаких зависимостей. DTO - это деталь реализации чего-то другого , чем модель предметной области, и поэтому для вашей модели предметной области ломается абстракция, чтобы узнать о них.
Рассматривали ли вы поискать AutoMapper для этого? Таким образом, вы будете писать намного меньше кода. В этом случае, я думаю, вы сможете просто сойти с рук:
Mapper.CreateMap<RegionOfInterest, RegionOfInterestData>();
Mapper.CreateMap<Camera, CameraData>();
А позже:
CameraData cd = Mapper.Map<Camera, CameraData>(camera);
Это не только уменьшает отток кода, но и разделяет код отображения на его собственный «слой отображения» - у вас есть один или несколько модулей, которые регистрируют эти отображения, которые вы можете поместить в любую сборку, которая действительно использует DTO.
И, конечно, вы всегда можете создать методы расширения, чтобы упростить фактическое отображение:
public static class CameraExtensions
{
public static CameraData ToCameraData(this Camera camera)
{
return Mapper.Map<Camera, CameraData>(camera);
}
}
Что делает все это так же просто, как написание camera.ToCameraData()
, но без , создавая жесткую зависимость между объектом домена (Camera
) и DTO (CameraData
). Вы имеете в основном всю простоту использования вашей оригинальной версии, но без сцепления.
Если вы создаете эти зависимости, потому что вы пытаетесь создать объект CameraData
из личных данных Camera
, которые не публикуются публично, то моя немедленная реакция будет такой: что-то не так с этим проектом. Почему бы не предоставить свойства только для чтения для объекта Camera
? Если вы в любом случае предоставляете к ним доступ из внешнего мира методом ToData
, то вы явно не скрываете эту информацию, а просто делаете ее более громоздкой.
Что если вы решите через 3 месяца, что вам нужен другой тип DTO? Вам не нужно изменять свой объектно-ориентированный объект Camera
каждый раз, когда вы хотите поддержать новый вариант использования. На мой взгляд, лучше добавить в класс несколько общедоступных свойств, доступных только для чтения, чтобы картостроители могли получить доступ к необходимым им атрибутам.