我有一个和Ninject - Kernel in static class?相同的问题,但我没有使用WCF,只是一个类库。
在任何时候实例化内核还是拥有一个静态内核更好?我的UI(现在在MVC应用程序中)消费服务,所以它会调用静态内核吗?什么是最好的方法?
在任何时候实例化内核还是拥有一个静态内核更好?我的UI(现在在MVC应用程序中)消费服务,所以它会调用静态内核吗?什么是最好的方法?
有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;
}
}
还有Ninject与WCF:
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;
}
}
Service1
是否在同一个 AppDomain
中?2. 它们是否来自同一源代码树?如果至少第一个是“是”,那么一个 Kernel
就可以注入所有内容。如果第一个是“否”,但它们来自同一源代码树(第二个是“是”),则配置可以被重用。无论如何,创建一个静态的 Kernel
将引入额外的依赖项,但不会解决它。 - AkimMark Seemann在他的博客http://blog.ploeh.dk/2011/07/28/CompositionRoot.aspx中说道:只有应用程序应该有组合根,库和框架不应该有。
这回答了我的问题,我更好地理解了组合根模式。感谢Akim和Alexander R的帮助。