可以/应该数据传输对象实现接口吗?

时间:2012-12-01 21:50:46

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

我想知道是否有人可以帮我解决这个“架构难题”,

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

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

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

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

现在,在我的域层中,接口看起来很好,

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

简单地说:

如果在表示层中我有

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

=&GT;简单的对象,简单的渲染。

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

我的问题是:DTO应该再次实现完全相同的界面吗? 还是我从错误的一面看问题?

1 个答案:

答案 0 :(得分: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默认项目中的AccountModel,您将看到User是DTO并且以多种方式操作(LoginModel,ForgotPasswordModel,RegisterModel),但总是最终返回DTO。通过View查看DAL时,事情并不总是如此;)