我有一个项目,我们使用屏幕DTO在服务层和表示层之间封装数据.在我们的例子中,表示层是ASP.Net.
知道DTO的唯一的类是服务层类和称为这些服务并显示DTO的Pages / Controls.
DTO几乎总是Page / Control特定的,所以我觉得他们属于表示层,但这意味着服务层必须参考表示层才能使用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())