我和Ninject - Kernel in static class?有同样的问题 但我没有使用WCF,只是一个类库。
拥有静态内核或在任何时候实例化它更好吗? 我的UI(现在在MVC应用程序中)使用该服务,所以它会调用静态内核吗? 什么是最好的方法?
答案 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
}
}
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;
}
}
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的帮助