3

我和Ninject - 静态类中的内核有同样的问题? 但我没有使用 WCF,只有一个类库。

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

4

3 回答 3

6

使用 IoC 时,首选方法是尽可能少地使用内核。应该在初始化时使用它来连接所有东西,然后快速而安静地淡入背景。因此应用了“好莱坞原则”:“不要调用 IoC 容器,让它调用你!”。包含内核的静态类就是所谓的服务定位器反模式,请参见此处

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

于 2012-07-30T13:14:55.437 回答
0

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

这就是我的问题的答案,我更好地理解了作文根模式。感谢 Akim 和 Alexander R 的帮助

于 2012-07-31T11:46:26.287 回答
0

MVC 扩展有Ninject,那么为什么不将它用于 MVC UI 呢?

并且 WCF 服务可以有自己的组合根。当然,您可以NinjectModule在两者中重用一个实现。所以不需要Kernel是静态的,只需NinjectModule在每个组合根中重用实现即可。

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

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

带有 Ninject 的 MVC

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 与 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;
    }
}
于 2012-07-30T13:20:14.527 回答