【问题标题】:Can/Should Data-Transfer-Objects implement Interfaces?数据传输对象可以/应该实现接口吗?
【发布时间】:2012-11-19 18:53:36
【问题描述】:

我想知道是否有人可以帮助我解决这个“建筑困境”,

我正在从不同类型(类)中检索一些对象,例如:帖子、文档和图片

事实证明,在表示层中,我必须将它们呈现在单个容器中: 想想共享点库的例子,你有一个文件夹,里面可以有各种对象。

我想按属性对它们进行排序(比如说 PublishingDateTime)

我知道如果我想对它们进行排序,它们都应该实现相同的接口,所以将它们实现为(比方说 ISortingCapable)

现在,在我的域层中,接口看起来还不错,

但是,我意识到这并没有帮助,因为这些实例化的对象作为 DTO 进入了表示层(它们不再是相同的域对象)=> 将 DTO 视为 MVC 中视图的模型。

简单地说:

如果在表示层我有一个

List<PostDTO> 
List<PictureDTO> 
List<DocDTO> 

=> 简单的对象,简单的渲染。

现在我想在单个内容流中对它们进行排序。

我的问题是:DTO 是否应该再次实现完全相同的接口? 还是我从错误的角度看待问题?

【问题讨论】:

  • 你不能对域对象进行排序,然后在不破坏排序的情况下将它们转换为 DTO?将业务对象转换为 DTO 应该是非常简单的 1:1 映射。对 DTO 的处理不仅仅是一组简单的属性,对我来说似乎是一种代码味道。
  • @MushinNoShin 是的,你是对的,但是想想这个:在表示层中你有一个 List + List + List => 简单的对象和简单的渲染,但是现在我需要在单个容器(如 Stream)中对它们进行排序,我无法对它们进行排序,因为它们不是同一类型。
  • 好的,如果它们没有共同的类型,那么你在做什么来尝试对它们进行排序?必须有一些共同的属性,可能不在实现中,但可能在接口中。问题是否存在于类型层次结构中?
  • @MushinNoShin 想想操作系统文件夹,在一个文件夹内还有其他文件夹、图片和文档,它们都是不同的,但您可以按日期时间属性对它们进行排序。自域以来,我的域对象具有通用接口,但不再作为表示层中的 DTO。我真的不知道问题是整个世界还是我自己:-/
  • 这听起来确实是通过添加一个通用的基类来解决的。只要行为没有被添加到 DTO,它就不会破坏关注点分离..

标签: model-view-controller software-design n-tier-architecture


【解决方案1】:

如果在某些时候您需要将它们再次从视图中分离出来的逻辑,假设您想要查看进入其自己的控制器的每个单独的项目,您也可以聚合它们并包含一些导航属性:

    public IEnumerable<StreamItem> GetStream() {
        var posts = (from post in postsDb
                     select new StreamItem() { ID = post.ID, Name = post.Name, Url = "Posts/Details/" });

        var docs = (from doc in docsDb
                    select new StreamItem() { ID = doc.ID, Name = doc.Name, Url = "Docs/Details/" });

        var stream = posts.Union(docs);

        return stream;
    }

    public class StreamItem {

        public string Url { get; set; }
        public int ID { get; set; }
        public string Name { get; set; }

    }

Mushin 是正确的,尽管它们中的每一个都应该已经从一个基本类型继承,在我之前的例子中可能是 StreamItem。

您只需要视图端的 Url(或其他标识符)即可确定返回的路径。

如果您查看 MVC 的默认项目中的 AccountModels,您会发现 User 是 DTO,并以多种方式进行操作(LoginModel、ForgotPasswordModel、RegisterModel),但最终总是回到 DTO。当通过视图查看 DAL 时,事情并不总是它们看起来的样子;)

【讨论】:

    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多