Ninject / IoC正确初始化StandardKernel

时间:2012-03-03 18:52:06

标签: c# .net inversion-of-control ninject ioc-container

我刚刚开始使用IoC容器,并且已经开始使用Ninject。我理解您可以合并到内核中的单独模块的原理。但是我很好奇我是否应该在我的代码中到处都是第一行,我将要求从我的服务层中具体实现某些内容。

IKernel kernel = new StandardKernel(new SimpleModule());
// example: getting my ContentService
IContentService contentService = kernel.Get<IContentService>();

如果我有一个包含10个使用ContentService的方法的类,我应该在每个方法中新建一个Module和一个内核吗?好像是代码味道。大多数开发人员如何使用Ninject处理这个问题?是否有任何在线文章显示了与消费者类一起做这件事的正确方法?

2 个答案:

答案 0 :(得分:3)

  

如果我有一个包含10个方法的类,我应该使用ContentService   在每种方法中真正新建一个模块和一个内核?

不,你应该让这个类把IContentService作为构造函数参数(因为它在它的方法中取决于它),然后让内核为你提供这个类的实例。你的课程对DI容器一无所知(在你的情况下是Ninject)。他们永远不应该参考它。

答案 1 :(得分:1)

基本上有两种使用IoC的方法:依赖注入(DI)和服务位置(SL)。 处理依赖注入时,您可以从类外部提供依赖关系。通常,您可以通过将依赖项注入(传递)到类构造函数中或使用setter来完成此操作。例如:

public class SomeClass {
        public ISomeDependency SomeDependency {get;set;} 

        public SomeClass(ISomeOtherDependecy someOtherDependency) {
           //...
        }
}

在这种情况下,您可以通过属性提供ISomeDependency实现,您应该通过构造函数提供ISomeOtherDependecy实现。 Ninject支持两种方式。

另一种做法(SL)允许您在需要时请求您的依赖项,例如:

public void DoSomeAction() {
   ISomeDependency someDependency = MyServiceLocatorImpl.GetInstance<ISomeDependence>()
}

如果您打算使用SL方法(或混合方法),可以使用Common Service Locator(Ninject has support)。以后可以轻松切换IoC引擎。