Model view controller ASP.NET MVC:将视图模型相互嵌套,是否为反模式?

Model view controller ASP.NET MVC:将视图模型相互嵌套,是否为反模式?,model-view-controller,viewmodel,Model View Controller,Viewmodel,我有一个项目,其中ViewModels相互嵌套,因此它们本质上是域层次结构的字符串类型复制。例如,如果我们的域具有以下关系: 组织有1到多个环境 环境有1到多台机器 然后将有一个OrganizationViewModel,其中包含一对多EnvironmentViewModels,EnvironmentViewModel本身也将包含一对多MachineViewModels。然后,这种层次结构样式在整个应用程序中重复使用,这种类型的ViewModel大约有五种。(例如,EnvironmentView

我有一个项目,其中ViewModels相互嵌套,因此它们本质上是域层次结构的字符串类型复制。例如,如果我们的域具有以下关系:

组织有1到多个环境

环境有1到多台机器

然后将有一个OrganizationViewModel,其中包含一对多EnvironmentViewModels,EnvironmentViewModel本身也将包含一对多MachineViewModels。然后,这种层次结构样式在整个应用程序中重复使用,这种类型的ViewModel大约有五种。(例如,EnvironmentViewModel用于多个页面,MachineViewModel也用于其中的许多页面,这取决于所查看的层次结构的级别……为了讨论的目的,我对其进行了简化,但层次结构略大于上面的3)

现在,尽管我很想从上面下来谴责这种做法,但我还没有找到太多关于这方面的信息。有人能告诉我更多关于惯例的细节吗?分享轶事

(我自己的偏见是,这些视图模型不应该以这种方式相互嵌套,并且视图模型实际上应该对应于视图,而不是域对象。我发现一些可维护性问题相当混乱。但我想知道其他人的想法或经历。)


视图模型应尽可能平坦(尽管用于对多个相关属性进行逻辑分组的嵌套不可变对象可以用于整理)

不要认为它是“viewmodel应该与视图相对应”,而应该反过来想:“视图是viewmodel数据的html表示”

ViewModel
是一个可怕的术语,因为它不是视图,也不是模型,而是资源的表示

如果我这样做:

`GET /User/1`
我希望返回一些表示用户1的数据。如果是HTML格式,因为我发送了

`Accept: text/html`
那就这样吧。考虑一下你的VIEW模型是什么样子的XML或JSON. < /P>
在创建依赖关系链时,尽量避免嵌套viewmodels,只需复制属性,就不会违反DRY的规定。我们过去一直在关注Josh Smith的文章。虽然是WPF而不是MVC,但我相信这个概念仍然适用。我发现它是一种合理的机制,可以在每个上下文中分离显示的关注点,并允许更大的灵活性和重用


HTH

我想说嵌套视图模型很好。我知道viewmodels只用于一个特定的视图,但如果不将Address ViewModel嵌套在其他各种视图模型中,则似乎有点浪费。当然,这会使更新更容易,并提供一个很好的结构

我尽可能地保持我的水平,尽管通常情况下,我发现遇到的大多数情况都需要1级嵌套


我在这里回答的相关问题:

视图模型应该与UI概念相关联,而不一定与域概念相关联。因此,在您的示例中,我可以想象一个屏幕显示组织详细信息和环境列表;单击一个环境会显示一个详细信息屏幕,该屏幕将显示机器列表;单击其中一个按钮,将进入机器详细信息视图

在该示例中,有两种不同的环境或机器视图,一种是占据列表中一行的摘要视图,另一种是占据屏幕更好部分的详细信息视图,每个视图都应该有自己的ViewModel。我可能会为此创建ViewModels,如下所示:

OrganizationDetailsViewModel
----List of EnvironmentSummaryViewModels


EnvironmentDetailsViewModel
----List of MachineSummaryViewModels

MachineDetailsViewModel

根据用户界面的复杂程度,嵌套可能会变得更深。让我们假设您有一个用于环境的小图形状态指示器,它查看状态并以特定颜色显示。您可以创建一个单独的EnvironmentStatusViewModel,然后嵌套在EnvironmentSummaryViewModel中,也可能嵌套在EnvironmentDetailsViewModel中。

我仍然想知道它的优点。。。和缺点。 阅读起来是更快还是更简单?如果您有一个需要呈现所有信息的视图,那么急切地获取要在单个DB Get中显示的所有内容而不是多个懒惰的聊天连接不是更简单吗

在一个视图中,用户不想看到“组织摘要”,其中包括所有相关的“环境”和“机器”。如果没有其他内容,则可能嵌套项的计数。 (不是环境和机器细节-这些值得不同的观点)

似乎倾向于使用建筑视图来承担单一责任(查看机器(仅显示机器信息)->查看机器详细信息(仅显示机器详细信息))
实现这一点很简单,但总有一天视图的功能不丰富,因为信息太少

需要更多的上下文。如果你在数据上做表单(简单的CRUD应用程序),那么你所描述的可能就足够了。您是否在您的域中执行任何实际过程,以至于域模型实际上与视图不同?嘿,Derick,此项目中的一些视图主要是其中一个域对象的表示,其中可能包含另一个域对象的一个或两个属性,用于链接到另一个区域(例如,有一个ManageEnvironment视图上有指向ManageMachine的链接,因此我们使用EnvironmentViewModel.MachineViewModel.ID来获取该ID以进行链接)。我认为“考虑一下您的viewmodel作为xml或json的样子”在这里,bit可能是最重要的一点。我经常使用这个透视图来帮助我理解视图模型应该是什么样子,帮助我理解什么数据是“viewmodel”数据与“视图HTML呈现中的数据”。有助于保持事物干净,并将它们很好地分开