【发布时间】: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