Asp.net 视图中的域对象

Asp.net 视图中的域对象,asp.net,asp.net-mvc,asp.net-mvc-2,Asp.net,Asp.net Mvc,Asp.net Mvc 2,我们一直在讨论是在视图中使用域对象(asp.net mvc 2),还是每个需要数据的视图都应该发送一个ViewModel 我想知道是否有人在这个问题上有任何赞成/反对意见,他们可以解释一下 谢谢你如果你使用NHibernate或类似的-你的域对象很可能是代理,序列化这些dun工作。您应该始终使用ViewModel并将域对象映射到ViewModel中的DTO。不要走捷径。制定惯例将减轻你以后所遭受的痛苦 这是一个标准的模式,这是有原因的 w://我喜欢将我的域对象与我的视图分离。就我而言,我的域对

我们一直在讨论是在视图中使用域对象(asp.net mvc 2),还是每个需要数据的视图都应该发送一个ViewModel

我想知道是否有人在这个问题上有任何赞成/反对意见,他们可以解释一下


谢谢你

如果你使用NHibernate或类似的-你的域对象很可能是代理,序列化这些dun工作。您应该始终使用ViewModel并将域对象映射到ViewModel中的DTO。不要走捷径。制定惯例将减轻你以后所遭受的痛苦

这是一个标准的模式,这是有原因的


w://

我喜欢将我的域对象与我的视图分离。就我而言,我的域对象仅用于表示应用程序的域,现在是应用程序的显示方式

表示层不应包含任何域逻辑。它们显示的所有内容都应由其控制器预先确定。确保始终遵守这一点的理想方法是确保视图仅接收这些展平视图模型

我自己也问了一个问题。以下是我接受的答案中的一句话:

我认为这是有好处的 有不同的设计 域,而不是表示层中的域。 所以从概念上说你实际上是 看看两个不同的模型,一个 一个用于域层,另一个用于 表示层每个模型 针对其目的进行了优化

如果我有
客户
销售
派送地址
的域对象,那么我不想在视图中处理对象遍历。我创建了一个包含所有属性的展开视图模型。如果您使用优秀的开源项目,那么在映射到这个扁平化视图/表示模型和从中映射几乎不需要额外的工作


此外,如果可以创建模型的优化表示,为什么要将整个域对象传递回视图?

这取决于具体情况。在某些情况下,可以使用模型类的实例。在其他情况下,单独的ViewModel是更好的选择。根据我的经验,在您的领域和视图中使用不同的模型是完全可以接受的。或在视图中使用域模型。做最适合你的事。对每个选项做一个尖峰测试,看看什么有效,然后决定。您甚至可以为每个视图(和/或部分视图)选择不同的选项。

肯定会有一些简单的小应用程序,可以在所有层中使用相同的模型。通常,数据应用程序上的表单很少。但是对于一个合适的领域,我的想法是将领域模型和视图模型分开,因为您不希望它们在更改时相互影响


如果域逻辑需要一个小的更改来处理后端的一些新业务逻辑,那么您不希望冒着改变视图的风险。相反,如果市场营销部或其他人想要对某个视图进行更改,您不希望这些更改泄漏回您的域中(必须填充字段并维护数据,而不是为了某个视图使用它)。

我目前有一个很好的比较,因为我正在使用不同的方法处理两个项目。我并不是说“这是坏的,这是好的”,因为这是用一些模式写的。我知道模式,我喜欢模式,但我从不盲目地遵循它们,只是为了正确。我总是使用我当前需要的东西来实现当前的目标

在第一个应用程序中,使用视图中的域对象,开发速度非常快。在很少的地方进行很少的更改,并且您有额外的属性、表单输入等。您不必担心层,只需扩展/更改代码并传递到另一个问题

在第二个应用程序中,这里、那里和其他地方都有可以使用的对象,有几十个看起来相同的类,做着相同的事情,在相同对象的不同版本之间有大量的转换代码。更糟糕的是,一些开发人员在类的“这个版本”上执行一些逻辑,而其他逻辑在“那个版本”上执行。开发是非常痛苦的,并且需要大量的测试。更改一件简单的事情需要大量的关注,并且需要更改大量的代码。我真的不喜欢这个应用程序,因为我从来没有看到过一个企业从这个方法中受益,至少在去年(我们从今年开始就处于生产阶段)。这个应用程序的开发和维护成本是第一个应用程序的四倍


所以,我对这个问题的有趣回答是:视情况而定。如果你在10-20人的团队中工作,你喜欢进入工作,喝几口棺材,和朋友聊天,做几件简单的事情,然后回家,很多中间对象和转换代码都会对你有好处。如果你的目标是快速和廉价,如果你想专注于业务层、新功能、快速变化,以及更多如果你接触软件业务并想兑现你的项目(我们做所有这些事情是为了最终出售,对吗?),第二种方法可能会更好。

+1,但是简单的领域对象,比如类别,又如何呢,只有身份证和标签吗?对于一些包含大量这些内容的应用程序,创建MyEntity{Id,Label}和MyDto{Id,Label}可能会变得非常烦人,其中唯一不同的是名称。@mathieu-显然,当涉及到这样的示例时,您可以谨慎使用:)。像您的示例这样的域对象不包含任何域逻辑,因此肯定是可以接受的。如果你有时间的话,你能看看这个吗?我对asp.NETMVC技术并不陌生,但对于“哲学”和设计,我可以使用一些指针!在映射到展平模型或从展平模型映射到展平模型时,可能“几乎没有额外的工作”,但在创建和维护2个(甚至3个)展平模型时,肯定会有额外的工作