Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Asp.net MVC中,viewmodels是否建议从域模型派生?_C#_Asp.net Mvc_Model View Controller - Fatal编程技术网

C# 在Asp.net MVC中,viewmodels是否建议从域模型派生?

C# 在Asp.net MVC中,viewmodels是否建议从域模型派生?,c#,asp.net-mvc,model-view-controller,C#,Asp.net Mvc,Model View Controller,(我正在使用ASP.NETMVC,但这似乎是一个更通用的MVC问题) 假设您有一个表示人员的域模型,并且您有一个用于编辑人员的视图。Person域对象中包含居住状态属性,并且在视图中需要列出状态的下拉列表 是否有任何理由不创建从域模型派生的视图模型,并且只包含视图所需的UI spiciness属性?如果是这样,为什么不想这样做 TIA我认为从域模型派生视图模型会引入MVC想要避免的耦合;不过,也就是说,做对您的应用程序最有意义的事情 我更喜欢将视图模型分开,因为这样做可以让我自由地大幅更改域模型

(我正在使用ASP.NETMVC,但这似乎是一个更通用的MVC问题)

假设您有一个表示人员的域模型,并且您有一个用于编辑人员的视图。Person域对象中包含居住状态属性,并且在视图中需要列出状态的下拉列表

是否有任何理由不创建从域模型派生的视图模型,并且只包含视图所需的UI spiciness属性?如果是这样,为什么不想这样做


TIA

我认为从域模型派生视图模型会引入MVC想要避免的耦合;不过,也就是说,做对您的应用程序最有意义的事情


我更喜欢将视图模型分开,因为这样做可以让我自由地大幅更改域模型,并获得更好的编译时支持,以便将视图模型重新映射到新的域模型。

不,您真的不想这样做

使用ViewModels的很大一部分原因是因为您的域实体往往是大的、尖的、复杂的,并且与持久性机制有关。所有这些都会导致他们在遇到DefaultModelBinder之类的东西时出现奇怪、有趣或破坏性的行为

通过使用更简单的ViewModel类,您可以避免大部分这些问题,同时还可以进一步将UI层与域模型分离


现在,您应该做的是提供从域实体生成ViewModel或从ViewModel更新域实体的简单方法。

这不是推荐的做法,因为您要求您不要这样做。简单的回答是为要渲染的每个视图创建一个唯一的视图模型。保持1-1视图到视图模型的关系,在编写代码时,您将看到原因

答案很长,可以在这里和其他许多地方找到

谢谢,


这里的大部分建议我都不同意

我认为您的域模型应该是干净的,并且viewmodel做它必须做的事情。 如果你的观点需要一个人和时间在伦敦,我不认为这样做有什么问题:

ExampleViewModel : Person {
 Public DateTime LondonTime { get; set;}
}

另一个视图模型
{
公众人物SomeGuy{get;set;}
公共列表猫{get;set;}
}
如果您的视图需要一个人和小猫列表


这可以保持你的域名干净;伦敦的时间与一个人无关,但在你看来,你仍然需要获得数据。这是imho视图模型的全部观点

+1用于评论域实体绑定到持久性机制的趋势。我发现,对于视图模型的POCOs,我不太可能遇到奇怪的序列化行为。您是否可以对以下评论进行扩展:“您应该做的是提供从域实体生成ViewModel或从ViewModel更新域实体的简单方法。”您的意思是一般性的吗?除非有必要,否则我希望避免编写一堆每个viewmodel实体更新代码。您可以做很多事情来简化工作,例如AutoMapper,但根据实体和viewmodels的分歧程度,您可以维护一些手动代码。“域模型将引入MVC想要避免的耦合“这句话根本不是真的。Django/RoR实现,其中viewmodels实际上是数据库模式的紧密耦合表示。MVC没有对您的模型应该是什么发表意见,只是它不是您的V和C的一部分。来自Wikipedia:许多应用程序使用持久存储机制,例如数据库来存储数据。MVC没有特别提到数据访问层,因为它被理解为位于模型之下或由模型封装。模型不是数据访问对象;然而,在几乎没有域逻辑的非常简单的应用程序中,没有真正的区别。Active Record是一种公认的设计模式,它将域逻辑和数据访问代码合并在一起——一种知道如何保持自身的模型。@jfar:你的观点很好;然而,MVC自己的许多示例使用LINQtoSQL或LINQtoEntities或Dataset作为域模型。所有这些模型都至少与持久性存储机制有一些耦合,并且在实践中被用作模型(经常使用)。@jfar:我对MVC还很陌生,但我就是这么想的。我还看到有人认为viewmodel只应在必要时使用,但如果不需要,使用域模型也可以。但是,我从来没有见过讨论从域模型派生viewmodel是好是坏的想法,这似乎很奇怪-如果将视图绑定到域模型是可行的做法,为什么不绑定到从域模型派生的viewmodel?@jfar:这里的问题不是模型是否应该反映数据存储,但ViewModel是否应从模型继承。在我的应用程序中,它们并不是因为我描述的原因,尽管我采取了更务实的方法,而不是教条式的方法。我并不反对模型与数据结构的耦合。我只是认为视图模型应该比模型更紧密地结合到视图中。第一个例子应该支持组合而不是继承我理解视图模型的用法,但即使是您引用的链接也得出结论:“如果您能够在简单的情况下直接绑定到域模型,这是最简单、最容易的解决方案。”原始帖子中引用的场景仅比域模型中包含的场景多(尽管我并不是说,如果它变得越来越复杂,它可能不会崩溃)。我知道很多人(大多数人?)觉得从CRUD域模型导出viewmodel并不理想。我只是不明白,如果使用域是最简单和最容易的,为什么会这样。谢谢
AnotherViewModel 
{
 Public Person SomeGuy { get; set;}
 Public List<Kitty> Cats{ get; set;}
}