У меня есть n-уровневое приложение MVC2 (DAL, Domain, Service, MVC web), использующее подход DDD (Domain Driven Design), имеющее модель домена с репозиториями. Мой сервисный уровень использует шаблон запроса / ответа , в котором объекты Request и Response содержат DTO (объекты передачи данных) для перенаправления данных с одного уровня на другой, а сопоставление выполняется с помощью AutoMapper. У меня такой вопрос: какую форму обычно должен принимать DTO? Может ли он иметь также вложенных / сложных DTO или это строго проекция flat ? Или, возможно, смесь обоих? Кроме того, каковы основные причины наличия плоского DTO по сравнению с более сложным / вложенным DTO?
Например, предположим, у меня был домен, такой как следующий:
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Company Company { get; set; }
}
public class Company
{
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
}
Есть три разных способа моделирования объекта Response.
Опция 1 - опция DRYest:
public class GetEmployeeResponse
{
public class EmployeeDTO { get; set; } // contains a CompanyDTO property
}
Из проведенного мною исследования было бы неуместно для DTO принимать форму, подобную объекту (ам) домена, как показано выше.
Вариант 2 - сплюснутая проекция домена (анти-СУХОЙ):
public class GetEmployeeResponse
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string CompanyName { get; set; }
public string CompanyAddress { get; set; }
public string CompanyCity { get; set; }
public string CompanyState { get; set; }
}
Это проще, чем, очевидно, должен быть DTO, но, в конечном счете, увеличивает число DTO.
Вариант 3 - смесь обоих:
public class GetEmployeeResponse
{
public EmployeeDTO Employee { get; set; }
public CompanyDTO Company { get; set; }
}
Это позволяет сделать код немного более сухим, многократно используемым и управляемым, а также не раскрывает структуру моего домена для конечного пользователя. Другое основное преимущество заключается в том, что другие ответы, такие как GetCompanyResponse
, могут просто возвращать CompanyDTO
, без необходимости копировать все эти свойства, аналогично варианту 2. Что вы думаете? Какой вариант из них (если есть) вы выбрали и / или работали для вас? Если эти Запросы / Ответы позже будут представлены как методы службы WCF, ваш ответ изменится?