2012-08-11 225 views
0

我对DI和IoC有点困惑。我建立了MVC,并使用Ninject进行属性注入,并且它完美地工作。我的应用程序设置为使用MvcContrib中的便携式区域,每个区域都包含在提供者,服务,模型和控制器中。Asp.net mvc 3依赖注入

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

日Thnx提前

更新: 我也想知道是否可以使用属性注入正常类。

+0

“好方法”是什么意思?你需要成功申请成功的要求是什么? – 2012-08-11 19:14:54

+0

我主要关心的是对象生命周期,因为一些对象加载非常重要的对象,尽可能重用对象是相当昂贵的。其次是维护和升级简单 – 2012-08-11 19:17:21

回答

0

当你设计构造注塑模式在你的所有服务(reposities,应用服务,控制器等),则无需调用DependencyResolver.Current.GetService从一个类中,并没有必要做出的一个实例内核在最低的程序集中可用。

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

而不是使用构造函数注入,可以实现与属性注入相同。然而,由于惯例是属性是可选的依赖关系,Ninject(和任何其他容器)将跳过它不能注入的属性(隐式属性注入),而不是抛出异常,就像缺少构造函数参数依赖项。这又使得在应用程序中发现配置错误更加困难。所以,只要有可能,坚持构造注入。

+0

非常感谢您的详细解释。还有一个更小的问题,我可以使用控制器以外的任何其他形式的自动构造函数注入,因为控制器由控制器工厂处理,我可以为控制器不处理的元素构建我自己的工厂 – 2012-08-12 12:27:18

+0

绝对。您的容器将递归地构建依赖关系图。这意味着当请求一个控制器时,它将注入它的依赖关系和这些依赖关系的依赖关系。让您的服务具有包含所有(必需)依赖项的单个公共构造函数。这使生活变得如此简单。 – Steven 2012-08-12 13:17:03