Ninject - 类库项目中静态类中的内核

时间:2012-07-30 13:03:00

标签: c# dependency-injection inversion-of-control ninject

我和Ninject - Kernel in static class?有同样的问题 但我没有使用WCF,只是一个类库。

拥有静态内核或在任何时候实例化它更好吗? 我的UI(现在在MVC应用程序中)使用该服务,所以它会调用静态内核吗? 什么是最好的方法?

3 个答案:

答案 0 :(得分:6)

使用IoC时,首选方法是尽可能少地使用内核。它应该在初始化时使用,以便将所有内容挂起,然后快速安静地褪色到背景中。因此,应用“好莱坞原则”:“不要打电话给IoC容器,让它给你打电话!”。包含内核的静态类是所谓的服务定位器反模式,请参阅here

简而言之:您将希望使用构造函数注入来注入依赖项,而不是每次都创建内核,或者引用静态类。

答案 1 :(得分:0)

Ninject for MVC extension,为什么不将它用于MVC UI?

WCF服务可以拥有自己的composition root。当然,您可以在两个实现中重用一个NinjectModule实现。因此,Kernel不需要是静态的,只需在每个组合根中重用NinjectModule实现。

例如,您的应用程序配置:

public class ApplicationModule : NinjectModule
{
    public override void Load()
    {
        Bind<IAbstraction>().To<Implemtation>();
        //  and other general bindings
    }
}

MVC with Ninject

public class YourWebApplication : NinjectHttpApplication
{
  public override IKernel CreateKernel()
  {
     var kernel = new StandardKernel(new ApplicationModule ());

     // add some UI specific bindings, for example authorization
     kernel.Bind<IAuthProvider>().To<AuthProvider>();

     // binding between service contract and implementation/client
     kernel.Bind<IServiceContract>().To<WcfServiceClient>();

     return kernel;
  }
}

WCF with Ninject

public class Global : NinjectWcfApplication
{
    protected override IKernel CreateKernel()
    {
        var kernel = new StandardKernel(new ApplicationModule ());

        // add some service specific bindings, for example authorization
        // service has also some other small services that i call providers 
        // so ex Service 1 : has Iprovider1 Iprovider2 Iprovider3 
        kernel.Bind<IProvider1>().To<Provider1>();
        kernel.Bind<IProvider2>().To<Provider2>();
        kernel.Bind<IProvider3>().To<Provider3>();

        return kernel;
    }
}

答案 2 :(得分:0)

Mark Seemann在他的博客中说http://blog.ploeh.dk/2011/07/28/CompositionRoot.aspx 只有应用程序应具有组合根。图书馆和框架不应该。

这是我的问题的答案,我更了解组成根模式。 感谢Akim和Alexander R的帮助