我完全不了解ninject
我一直在分析别人的代码,并发现了几个nInject模块 - 这些类派生自Ninject.Modules.Module,并且具有一个包含大部分代码的load方法。
通过调用StandardKernel实例的LoadModule方法并传递模块类的实例来调用这些类。
也许我在这里漏了什么明显的东西,但是相比于只创建一个普通的类并调用其方法,或者创建一个静态的类和静态方法,这有什么好处呢?
我完全不了解ninject
我一直在分析别人的代码,并发现了几个nInject模块 - 这些类派生自Ninject.Modules.Module,并且具有一个包含大部分代码的load方法。
通过调用StandardKernel实例的LoadModule方法并传递模块类的实例来调用这些类。
也许我在这里漏了什么明显的东西,但是相比于只创建一个普通的类并调用其方法,或者创建一个静态的类和静态方法,这有什么好处呢?
Ninject模块是用于向IoC容器注册不同类型的工具。优点在于这些模块会被保存在它们自己的类中,这使得你可以将不同的层次/服务放在它们自己的模块中。
// some method early in your app's life cycle
public Kernel BuildKernel()
{
var modules = new INinjectModule[]
{
new LinqToSqlDataContextModule(), // just my L2S binding
new WebModule(),
new EventRegistrationModule()
};
return new StandardKernel(modules);
}
// in LinqToSqlDataContextModule.cs
public class LinqToSqlDataContextModule : NinjectModule
{
public override void Load()
{
Bind<IRepository>().To<LinqToSqlRepository>();
}
}
拥有多个模块可以实现关注点分离,即使在您的IoC容器内部也是如此。
你的问题似乎更多地涉及IoC和DI作为一个整体,而不仅仅是Ninject。是的,您可以使用静态配置对象来完成几乎所有IoC容器所做的事情。当您拥有多个依赖层次结构时,IoC容器变得非常好用。
public interface IInterfaceA {}
public interface IInterfaceB {}
public interface IInterfaceC {}
public class ClassA : IInterfaceA {}
public class ClassB : IInterfaceB
{
public ClassB(IInterfaceA a){}
}
public class ClassC : IInterfaceC
{
public ClassC(IInterfaceB b){}
}
目前构建ClassC很痛苦,因为存在多层接口。向内核请求一个IInterfaceC会更容易。
var newc = ApplicationScope.Kernel.Get<IInterfaceC>();
Bind<X>().To<Z>()
语句来设置绑定,而不需要模块。IKernel.Load(IEnumerable<Assembly>)
可以通过反射动态发现这些模块并加载它们。IKernel.Unload(string)
。