gpt4 book ai didi

model-view-controller - 数据传输对象可以/应该实现接口(interface)吗?

转载 作者:行者123 更新时间:2023-12-01 06:37:21 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

简单的说:

如果在表示层我有一个

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

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

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

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

最佳答案

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

    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。

您只需要 View 端的 Url(或其他一些标识符)就可以计算出它在返回的路上是什么。

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

关于model-view-controller - 数据传输对象可以/应该实现接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13664080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com