У меня есть n-уровневое приложение MVC2 (DAL, домен, служба, сеть MVC), использующее подход DDD (Domain Driven Design), имеющее модель домена с репозиториями. Мой уровень обслуживания использует шаблон Запрос / ответ , в котором объекты запроса и ответа содержат DTO (объекты передачи данных) для маршалинга данных от одного уровня к другому, а сопоставление выполняется с помощью AutoMapper. У меня такой вопрос: какую форму обычно должен принимать DTO? Может ли он иметь вложенные / сложные DTO, или это должна быть строго плоская проекция? Или, возможно, сочетание того и другого? Кроме того, каковы основные причины использования плоского 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 - плоская проекция домена (анти-DRY):
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, изменится ли ваш ответ?