我想知道是否有人可以帮我解决这个“架构难题”,
我正在检索来自不同类型(类)的一些对象,例如:帖子,文档和图片
事实证明,在表示层中,我必须在单个容器中渲染它们: 想想你有一个文件夹的sharepoint库的例子,你可以在里面有各种各样的对象。
我想按属性对它们进行排序(比如说PublishingDateTime)
我知道如果我想对它们进行排序,它们都应该实现相同的接口,所以将它们实现为(假设是ISortingCapable)
现在,在我的域层中,接口看起来很好,
然而,我意识到这没有用,因为这些实例化的对象作为DTO进入表示层(它们不再是相同的域对象)=>将DTO视为MVC中的视图模型。
简单地说:
如果在表示层中我有
List<PostDTO>
List<PictureDTO>
List<DocDTO>
=&GT;简单的对象,简单的渲染。
现在我想在一个内容流中对它们进行排序。
我的问题是:DTO应该再次实现完全相同的界面吗? 还是我从错误的一面看问题?
答案 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时,事情并不总是如此;)