Ninject模块的意图是什么?
我是一个完全新手ninject
我一直在拉别人的代码,发现nInject模块的几个实例 – 从Ninject.Modules.Module派生的类,并有一个包含他们大部分代码的加载方法。
通过调用StandardKernel实例的LoadModule方法并将其传递给模块类的一个实例来调用这些类。
也许我错过了这里明显的东西,但是这只是创build一个普通的旧类和调用它的方法,或者也许静态类与静态方法的好处是什么?
Ninject模块是用于向IoC容器注册各种types的工具。 好处是这些模块被保存在自己的类中。 这可以让你在自己的模块中放置不同的层次/服务。
// 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。 是的,您可以使用静态configuration对象来完成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){} }
在这个阶段,构buildClassC是一个痛苦的事情,具有多种深度的接口。 向IInterfaceC询问内核要容易得多。
var newc = ApplicationScope.Kernel.Get<IInterfaceC>();
也许我错过了这里明显的东西,但是这只是创build一个普通的老类和调用它的方法,或者也许静态类与静态方法的好处是什么?
是的,你可以调用一堆Bind<X>().To<Z>()
语句来设置绑定,没有模块。
不同的是,如果你把这些语句放在一个模块中,那么:
-
IKernel.Load(IEnumerable<Assembly>)
可以通过reflectiondynamic发现这些模块并加载它们。 - 绑定在逻辑上按名称分组在一起; 你可以使用这个名字来卸载他们再次与
IKernel.Unload(string)
也许我错过了这里明显的东西,但是这只是创build一个普通的旧类和调用它的方法,或者也许静态类与静态方法的好处是什么?
对于我们来说,这是在以后的时间很容易添加testing的能力。 只需重写几个与mockobjects的绑定,然后在遗留代码上剔除没有连接“一切”的DI,几乎不可能在没有一些返工的情况下插入testing用例。 只要在DI接线完成的情况下正确使用了DI,就可以非常简单地做到这一点,甚至在遗留的代码上也可能非常难看。
在许多DI框架中,您可以使用生产模块进行testing,使用覆盖与mockobjects的特定绑定的testing模块(将其余布线保留在原位)。 这些可能是系统testing,而不是unit testing,但是我倾向于比普通开发人员更喜欢更高级别的testing,因为它testing类之间的集成,对于join项目的人来说,这是一个很好的文档,可以看到整个function只是function的一部分)而不必设置整个系统)。