Форма DTO: плоская, сложная / вложенная или их комбинация

У меня есть 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, изменится ли ваш ответ?

21
задан tbehunin 11 October 2010 в 23:34
поделиться