Asp.net mvc ASP MVC 3:ViewModels中的依赖项注入是个好主意吗?

Asp.net mvc ASP MVC 3:ViewModels中的依赖项注入是个好主意吗?,asp.net-mvc,asp.net-mvc-3,design-patterns,Asp.net Mvc,Asp.net Mvc 3,Design Patterns,我面临一个mvc 3应用程序的设计问题。我有一个viewmodel ProductCreateModel,它有一个类别列表 现在我正在控制器中设置Categories列表,但是我在想在ProductCreateModel构造函数中索引数据源是否是一个好主意 您认为视图模型应该是fat模型吗?它也知道从数据源读取依赖数据。。。或者这是控制器的问题?我更喜欢对数据层一无所知的slim viewmodels。它们更易于管理(以我的经验)。我认为视图模型应该是轻型模型,它们读取相关数据的唯一方法应该是“

我面临一个mvc 3应用程序的设计问题。我有一个viewmodel ProductCreateModel,它有一个类别列表

现在我正在控制器中设置Categories列表,但是我在想在ProductCreateModel构造函数中索引数据源是否是一个好主意


您认为视图模型应该是fat模型吗?它也知道从数据源读取依赖数据。。。或者这是控制器的问题?

我更喜欢对数据层一无所知的slim viewmodels。它们更易于管理(以我的经验)。

我认为视图模型应该是轻型模型,它们读取相关数据的唯一方法应该是“父”对象上的属性,即它们实际包装的模型


大多数情况下,我的视图模型只是带有属性的类,所有逻辑都在控制器或服务类中(如果我们讨论的是大量逻辑,那么这些逻辑将放在控制器中)。所有这些都是为了简化测试。

当我学习MVC时,我被教导“经验法则”是瘦控制器、胖模型和愚蠢视图。许多MVC开发人员犯的一个错误是胖控制器(太多逻辑)、瘦模型(基本上是用来保存数据的POCO类)和智能视图(一堆带有If-this、Else-that等的剃刀语法)

多年来,我一直坚持瘦控制器、胖模型、哑视图的方法,这对我来说效果很好。现在,请考虑这与模型相关,而不是与ViewModels相关。通常,您的模型应该位于完全不同的层(即proj或文件夹)。另一方面,ViewModels应该相当简单。这使得它们更易于测试,并且更易于重用。如果您发现需要某种服务、repo或其他依赖项来构建ViewModels,那么您可能应该将该逻辑抽象到某种Composer类中。在过去,我使用了一个实现IViewModelManager的ViewModelManager,如果需要,可以组合我的ViewModels。通过这种方式,您可以将IViewModelManager插入到控制器中,并使用它来构建ViewModels。然后,在ViewModelManager实现中,可以注入其他依赖项,如repo、服务等,以实际构建ViewModel

这种方法无疑需要更多的代码和更多的类,但它将为您提供良好的粒度和分离级别,并支持DRY原则和单一责任


快乐编码

一般来说,我认为你不想那样做


作为该规则的一个例外,在创建下拉列表时,我开始在编辑器模板中使用一点服务定位器。我已经经历了多种填充下拉列表的方法(通常是将集合添加到视图模型或视图数据中的某种形式)。我看到一个视频,其中在编辑器模板中使用SL获取数据,然后转换为选择列表。我最初的反应是“啊,真的吗?”,但是,我越想越有意义。

只是想知道,您是否在控制器的操作中实例化了一个新的viewmodel类?然后从服务中逐个设置每个属性,例如,在操作中?您是否也使用界面来抽象viewmodel?通常,我将在action方法中实例化viewmodel类。根据viewmodel与实际数据对象的模拟程度,可以使用automapper。我通常创建一个ToViewmodel扩展方法,并在需要将数据对象“转换”为viewmodel时使用该方法。我通常从不在viewmodels上使用界面。如果有意义的话,我可能会创建一个抽象的超类(几个视图模型共享大多数属性)。