我和Ninject - 静态类中的内核有同样的问题? 但我没有使用 WCF,只有一个类库。
拥有静态内核还是随时实例化它更好?我的 UI(现在在 MVC 应用程序中)使用服务,所以它会调用静态内核吗?最好的方法是什么?
我和Ninject - 静态类中的内核有同样的问题? 但我没有使用 WCF,只有一个类库。
拥有静态内核还是随时实例化它更好?我的 UI(现在在 MVC 应用程序中)使用服务,所以它会调用静态内核吗?最好的方法是什么?
使用 IoC 时,首选方法是尽可能少地使用内核。应该在初始化时使用它来连接所有东西,然后快速而安静地淡入背景。因此应用了“好莱坞原则”:“不要调用 IoC 容器,让它调用你!”。包含内核的静态类就是所谓的服务定位器反模式,请参见此处。
简而言之:您将希望使用构造函数注入来注入依赖项,而不是每次都创建内核或引用静态类。
Mark Seemann 在他的博客中说http://blog.ploeh.dk/2011/07/28/CompositionRoot.aspx 只有应用程序应该有组合根。库和框架不应该。
这就是我的问题的答案,我更好地理解了作文根模式。感谢 Akim 和 Alexander R 的帮助
MVC 扩展有Ninject,那么为什么不将它用于 MVC UI 呢?
并且 WCF 服务可以有自己的组合根。当然,您可以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;
}
}