【问题标题】:Asp.net mvc 3 dependency injectionAsp.net mvc 3 依赖注入
【发布时间】:2012-08-11 19:12:08
【问题描述】:

我对 DI 和 IoC 有点困惑。我已经设置了 MVC,并使用 Ninject 进行属性注入,它运行良好。我的应用程序设置为使用 MvcContrib 的 Portable Areas,每个区域都包含在提供程序、服务、模型和控制器中。

来自一个区域的提供者可以访问同一或子程序集中的其他提供者。为了解决提供者中的依赖关系,我使用了 DependencyResolver.Cur... ,它也被注册为使用 Ninject。我想知道这是否是一种好方法,因为我不想将所有其他提供程序从控制器传递到最后一层,但我想直接从提供程序访问它们。我应该在像 Core 这样的最低程序集中创建一个内核实例,以便我可以从任何地方直接访问它吗?

提前谢谢

更新: 我还想知道是否可以在普通类中使用属​​性注入。

【问题讨论】:

  • “好方法”是什么意思?您需要什么要求才能成功才能宣布成功?
  • 我主要关心的是对象生命周期,因为有些对象的加载成本相当高,因此尽可能多地重用对象非常重要。其次是维护和升级的简单性

标签: asp.net-mvc-3 c#-4.0 dependency-injection


【解决方案1】:

当您围绕构造函数注入模式设计所有服务(存储库、应用程序服务、控制器等)时,无需从类中调用DependencyResolver.Current.GetService,也无需使内核实例在最低程序集中可用。

当您的所有服务都使用构造函数注入时,您的容器将能够在请求根类型时构造依赖服务的对象图:在您的情况下是控制器类。当你这样做时,没有代码需要直接访问DependencyResolverKernel,这确保你的代码将更加可测试、灵活和可维护。任何访问DependencyResolver 或静态Kernel 实例的代码都难以测试、隐藏其依赖关系,并且难以以自动化方式验证容器的配置。

您可以使用 属性注入 来代替 构造函数注入。但是,由于约定是属性用于可选依赖项,因此 Ninject(和任何其他容器)将跳过它无法注入的属性(隐式属性注入),而不是抛出异常,就像缺少构造函数参数依赖项那样.这再次使得在您的应用程序中查找配置错误变得更加困难。所以,只要有可能,坚持使用构造函数注入。

【讨论】:

  • 非常感谢您的详细解释。还有一个小问题,我可以在控制器以外的任何其他形式使用自动构造函数注入,因为控制器是由控制器工厂处理的,我可以为控制器不处理的元素构建自己的工厂
  • 当然。您的容器将递归地构建依赖关系图。这意味着当请求控制器时,它将注入其依赖项以及这些依赖项的依赖项。让您的服务有一个包含所有(必需)依赖项的公共构造函数。这让生活变得如此轻松。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多