ViewModel中的MVC4 / AutoFac依赖注入

时间:2014-05-09 16:49:35

标签: c# vb.net asp.net-mvc-4 autofac

我在我们的MVC4应用程序中使用构造函数模式实现了DI,它已经完美地工作了几年。

最近,我们有一个承包商来做一些工作。他需要在视图模型中访问我们的服务层,并在viewModel的构造函数中对服务(及其存储库)进行硬编码,坏,坏,坏。

他所做的事情基本上搞乱了我们松散的耦合,我们努力实现和维护。

现在,时间阻止我们重新编写代码。

我们的ViewModel与MVC应用程序位于一个单独的程序集/项目中,我们的服务层和存储库层也是如此。

到目前为止一切顺利。

如何使用依赖注入来解析视图模型中的服务。

我再说一次,在视图模型中,不在控制器内!如果它使用属性注入模型或构造函数注入模型,对我来说无关紧要。

提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:3)

这很简单。如你所知,事实上你说过:在最简单的层面上,IoC和DI使用类似Autofac的东西是关于构造函数注入或属性注入。这个注入从树的顶部开始,并且通过构造函数本身一直沿着依赖链发生(C需要V,因此注入IV; V需要R,因此注入IR等)。

构造函数和属性注入基本相同。差异通常只是关于ctors中的参数膨胀(我说,并强调,通常是)。我还假设您不想使用服务定位器,因为您只是使用注射进行了所有艰苦的工作。

因此,简单的部分是使用Autofac注册VM类型,以允许您注入VM ctor或属性。然后,困难的部分是在创建VM的类(控制器或其他)中实例化VM,而无需在Autofac引用中进行硬编码,并以这种方式保持可测试性。

不能避免改变吗?

但是,我因此无法看到如何远离对Controller的构造函数进行某些次要更改(特别是创建ViewModel的类,如果这些不是控制器):他们需要通过构造函数(eugh)注入的模板ViewModel然后用实际值填充,或者他们需要一个"工厂"或"发电机"注入以允许它们创建视图模型,然后注入视图模型。还有其他一些事情可以让它发挥作用:它只是凌乱。

关系类型

你能否使用&#34; A需要创建B&#34的实例; relationship type,即将Func<TViewModel>注入视图模型实例化器中的相关方法,以允许您在必要时创建(还允许您在List<TViewModel>的情况下创建多个VM )。这将在不知道注入的情况下将服务注入VM ctor。

动态实例化&#34;意义&#34;这里将涉及对实际控制器的构造函数的最小更改,并将保留与控制器使用的服务相同的生命周期范围。

动作注射

另请注意,Autofac允许您使用ExtensibleActionInvoker作为IActionInvoker将参数注入到控制器操作方法中,因此如果您最终使用任何一个令人讨厌的Controller ctor膨胀,您可以注入{{ 1}}进入Action,作为最后的手段。

或者它是服务定位器......

要么是这个要么改变你的控制器接口(包括构造函数),而是求助Service Locator using Autofac创建ViewModels,并在你需要实例化的方法中注入依赖项的ViewModels。

从视图或API返回的虚拟机怎么样?

这些都没有解决另一个问题:从客户端作为参数传递回Post Action的ViewModel怎么样?使用Autofac注册ViewModel类型可能会为您解决这个问题,但我从来没有必要尝试并测试它。如果没有,则必须使用模板VM或VM Func<TViewModel>,并注入依赖项,然后将实际的VM属性复制到模板。