我有一个项目,我们使用屏幕 DTO 来封装服务层和表示层之间的数据。在我们的例子中,表示层是 ASP.Net。
唯一知道 DTO 的类是服务层类和调用这些服务并显示 DTO 的页面/控件。
DTO 几乎总是特定于页面/控制,所以我觉得它们属于表示层,但这意味着服务层必须引用表示层才能使用 DTO。
我几乎认为服务层应该返回更丰富的对象(但不是域实体?),然后表示层可以获取这些对象并将它们映射到每个页面/控制问题的非常具体的 DTO。
这是一个接口声明和一个 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())