当前位置:  开发笔记 > 后端 > 正文

什么项目层应该筛选DTO的生活?

如何解决《什么项目层应该筛选DTO的生活?》经验,为你挑选了1个好方法。

我有一个项目,我们使用屏幕DTO来封装服务层表示层之间的数据.在我们的例子中,表示层是ASP.Net.

唯一知道DTO的类是服务层类和调用这些服务并显示DTO的Pages/Controls.

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; }
}   

编辑

这是另一个代码示例,用于描述不涉及Domain模型的用例.也许这会澄清一些事情.我相信我已经超载了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())



1> sbohlen..:

甚至认为'DTO'的规范用例更像是"可以通过线路传递的可序列化对象",在这种情况下,您实际上更多地指的是"表示 - 传输 - 对象"或"视图模型".

通常,对于我们的项目,这些实际位置的答案是"转换"代码将DDD域模型映射到PTO类的位置.如果那是在Prensenation层(也许不是那么大的答案)那么pres.层是我声明PTO的地方.但通常情况下,它的"服务"为您进行翻译,这意味着"服务"和"演示"层都需要引用PTO,并且(通常)导致它们在单独的声明中,中性项目/汇编/命名空间/表示层和服务层可以引用的任何内容.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有