gpt4 book ai didi

asp.net-mvc - 不传递实体以查看的好处

转载 作者:行者123 更新时间:2023-12-02 07:44:42 25 4
gpt4 key购买 nike

我经常看到有人告诉你不应该将实体传递给你的 View 。他们说您应该改用 DTO/VO/ViewModel/AnyOtherThingYouWant,因为使用实体会增加耦合。忽略我确实需要一些额外逻辑(或者我不需要所有属性)的时刻,我看不出这样做有什么好处。例如,考虑以下类:

public class Contact {
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
}

我看到很多创建另一个类的代码,像这样:

public class ContactDTO {
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
}

在 View 中使用它然后执行此操作:

someMapper.Map(contactDto).To<Contact>();

我看不出这比简单地使用 Contact 类好多少,因为您的 View 将耦合到一个类,而该类又耦合到实体的类。因此,一个中的每个更改都应该复制到另一个中。从我的角度来看,“中间”对象只是为了增加复杂性,而不是真正的值(value)。我知道没有“一刀切”的解决方案(有时,使用中间对象很有意义),但我们真的需要添加这样的代码吗?真正的好处是什么?

最佳答案

可以这样想: View 是您的域的投影。它是您的业务模型的特定表示。所以你需要使用一个 View 模型来表示这个投影。它可以是域模型的子集,但如果 View 需要,它也可以是多个域模型的集合。您提供的示例只是一个特定情况,由于此特定 View 的要求,域模型和 View 模型之间存在 1:1 映射。但这只是一种特定的观点。我想您的应用程序有许多 View 和您的域实体的不同表示。

有许多特定于 View 的东西使您的域模型不合适,因此需要 View 模型。例如验证。在某些 View 中可能需要给定的域模型属性,而在另一个 View 中则不需要(想想创建/更新 View 中的 Id 属性)。如果您不使用 View 模型,而是让您的创建 Controller 操作直接采用域模型,那么如果您的域模型 Id 属性是用 Required 属性装饰的,那么您将遇到问题。

还有很多其他的例子。如果在开发 ASP.NET MVC 应用程序时我有一个建议要给你,那就是:始终为你的 View 定义特定的 View 模型,并且永远不要将域模型传递给 View /从 View 获取域模型,即使在你有的情况下也是如此域模型和 View 模型之间的 1:1 映射。

关于asp.net-mvc - 不传递实体以查看的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868776/

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