5

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

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

事实证明,在表示层中,我必须在单个容器中呈现它们:想想共享点库的示例,其中您有一个文件夹,并且可以在其中包含各种对象。

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

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

现在,在我的领域层中,界面看起来还不错,

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

简单的说:

如果在表示层我有一个

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

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

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

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

4

1 回答 1

0

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

    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 时,事情并不总是它们看起来的样子;)

于 2013-04-30T17:00:50.767 回答