【问题标题】:Ninject / IoC proper initialization of StandardKernelNinject / IoC 正确初始化 StandardKernel
【发布时间】:2012-03-03 18:52:05
【问题描述】:

我刚刚开始使用 IoC 容器,并开始使用 Ninject。我了解可以合并到内核中的单独模块的原理。但是我很好奇我是否应该在我的代码中的任何地方都有第一行,我将要求我的服务层中某些东西的具体实现。

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

如果我有一个包含 10 个使用 ContentService 的方法的类,我真的应该在每个方法中都新建一个模块和一个内核吗?看起来像代码气味。大多数开发人员如何使用 Ninject 处理这个问题?是否有任何在线文章显示了使用消费者类执行此操作的正确方法?

【问题讨论】:

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


    【解决方案1】:

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

    不,您应该让这个类将IContentService 作为构造函数参数(因为它在其方法中依赖于它),然后让内核为您提供这个类的实例。你的类应该对 DI 容器一无所知(在你的例子中是 Ninject)。他们永远不应该引用它。

    【讨论】:

    • 所以我想了解如果你走的是 DI 路线而不是 SL 路线,你应该只有一个类要求一个新的内核吗?在 WinForm 应用程序中是否意味着 Program 类会执行此操作,您需要在 MainForm (Form1) 中注入一些主服务,以便您可以访问所有其他服务?
    • 或者我想从 UI 层或 WCF 层我可以在该层的初始化期间新建一个内核,然后设置一个私有类级变量来保存对内核的引用。
    【解决方案2】:

    基本上有两种使用 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 引擎。

    【讨论】:

    • 当您使用 Common Service Locator 时,您是否会放弃此处提到的 Ninject List 功能:stackoverflow.com/questions/7959709/ninject-multicasting
    • 我不确定,因为这取决于 ninject 对 Common Service Locator 所需接口的实现。值得测试。无论如何,如果我的意见很重要,请不要使用服务位置。通过注入依赖项(而不是在需要时请求它们)来编写测试更容易(并且可读)。
    • 我靠它(SL)。只是想了解一些项目......比如一个简单的 WinForm 应用程序应该如何与 DI 一起工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2020-10-07
    • 2012-06-17
    • 2022-01-22
    相关资源
    最近更新 更多