【问题标题】:MVC4/AutoFac dependency injection in ViewModelViewModel 中的 MVC4/AutoFac 依赖注入
【发布时间】:2014-05-10 02:08:52
【问题描述】:

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

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

他所做的基本上是弄乱了我们努力实现和维护的松散耦合。

现在的时间阻止我们在这个时候重写他的代码。

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

到目前为止一切顺利。

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

我再说一遍,在视图模型中,而不是在控制器中!!使用属性注入模型还是构造函数注入模型对我来说都无所谓。

提前感谢您的帮助。

【问题讨论】:

  • 你说你没有时间重写他的代码。尽管不适合您的项目方法,但他的代码是否有效?如果它有效,并且他的方法并没有阻碍你取得其他进展,我建议简单地保持现状,满足任何最后期限,让你不能仅仅重写他的代码,然后花点时间去返回并让他的代码更适合您的项目
  • 你能举一个实现的小例子吗?有很多方法可以解决从基类继承的问题,您可以使用 Bootstrapper 或使用 ObjectFactory 进行注入,例如

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


【解决方案1】:

这简直太难了。如您所知,实际上您说过:在最简单的级别上,使用 Autofac 之类的 IoC 和 DI 是关于构造函数注入或属性注入。这种注入从树的顶部开始,并通过构造函数本身一直沿着依赖链发生(C 需要 V,所以注入了 IV;V 需要 R,所以注入了 IR 等)。

构造函数和属性注入基本上是一回事。区别通常只是关于 ctor 中的参数膨胀(我说,并且强调,通常)。我还假设您不想使用服务定位器,因为您付出了所有努力才只使用注入。

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

无法避免改变?

但是,因此我看不出如何避免对控制器的构造函数(特别是创建 ViewModel 的类,如果它们不是控制器)进行一些小改动:它们需要通过构造函数(eugh)注入的模板 ViewModel 供您使用实际值填充,或者它们需要注入“工厂”或“生成器”以允许它们创建依次注入的视图模型。你还需要做一些其他的事情才能让它工作:它只是一团糟。

关系类型

您是否可以使用“A 需要创建 B 的实例”relationship type,即在视图模型的实例化器中的相关方法中注入 Func<TViewModel> 以允许您在需要时创建(也允许您创建在List<TViewModel> 的情况下有许多 VM)。这将在您不知道注入的情况下将服务注入 VM ctor。

此处的动态实例化“含义”将对实际控制器的构造函数进行最小的更改,并保留与控制器使用的服务相同的生命周期范围。

动作注入

还请注意,Autofac 允许您使用 ExtensibleActionInvoker 作为 IActionInvoker 将参数注入到控制器操作方法中,因此如果您最终遇到令人讨厌的控制器 ctor 膨胀,您可以将 Func<TViewModel> 注入到操作中而是作为最后的手段。

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

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

从 View 或 API 返回的 VM 呢?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 2017-11-07
    • 2016-11-09
    • 1970-01-01
    • 2019-02-25
    • 2020-11-24
    相关资源
    最近更新 更多