У меня есть проект, в котором мы используем экранные DTO для инкапсуляции данных между Сервисным уровнем и Презентационным уровнем . В нашем случае уровень представления - это ASP.Net.
Единственными классами, которые знают о DTO, являются классы уровня обслуживания и страницы / элементы управления, которые вызывают эти службы и отображают DTO.
DTO почти всегда специфичны для страниц / элементов управления, поэтому я считаю, что они принадлежат к уровню представления, но это означает, что уровень обслуживания должен ссылаться на уровень представления, чтобы использовать DTO.
Я почти думаю, что Сервисный уровень должен возвращать более богатые объекты (но не доменные сущности?), И тогда Уровень Презентации может взять эти объекты и отобразить их в очень специфические DTO для каждой задачи Page / Control.
Вот объявление интерфейса и DTO, чтобы вы могли видеть, о чем я говорю:
public interface IBlogTasks
{
BlogPostDisplayDTO GetBlogEntryByTitleAndDate(int year, int month, string urlFriendlyTitle);
}
public class BlogPostDisplayDTO
{
public string Title { get; set; }
public DateTime PostDate { get; set; }
public string HtmlContent { get; set; }
public string ImageUrl { get; set; }
public string Author { get; set; }
public int CommentCount { get; set; }
public string Permalink { get; set; }
}
Редактировать
Вот еще один пример кода, описывающий случай использования, в котором модель Домена не задействована. Может быть, это немного прояснит ситуацию. Я полагаю, что я перегрузил значение DTO. Я не говорю о DTO для функции передачи объекта по проводам. Я создаю DTO для оформления контрактов между коммуникациями с моим сервисным уровнем.
public interface IAuthenticationTasks
{
bool AuthenticateUser(AuthenticationFormDTO authDTO);
}
public class AuthenticationFormDTO
{
public string UserName { get; set; }
public string Password { get; set; }
public bool persistLogin { get; set; }
}
Допустим, для моей аутентификации внезапно требуется параметр IP-адреса. Теперь я могу добавить это свойство в DTO, не меняя интерфейс моего контракта.
Я не хочу передавать сущности на свой уровень представления. Я не хочу, чтобы у моего кода была возможность перейти BlogPost.AddComment(new Comment())