C# Ninject模块的意图是什么?
我对ninject完全是个新手 我一直在分解其他人的代码,发现了几个nInject模块的实例——这些类派生自nInject.modules.Module,并且有一个包含大部分代码的加载方法 通过调用StandardKernel实例的LoadModule方法并向其传递模块类的实例来调用这些类 也许我在这里遗漏了一些明显的东西,但是与仅仅创建一个普通的旧类并调用它的方法相比,或者使用一个静态方法创建一个静态类有什么好处呢C# Ninject模块的意图是什么?,c#,dependency-injection,module,ninject,module-pattern,C#,Dependency Injection,Module,Ninject,Module Pattern,我对ninject完全是个新手 我一直在分解其他人的代码,发现了几个nInject模块的实例——这些类派生自nInject.modules.Module,并且有一个包含大部分代码的加载方法 通过调用StandardKernel实例的LoadModule方法并向其传递模块类的实例来调用这些类 也许我在这里遗漏了一些明显的东西,但是与仅仅创建一个普通的旧类并调用它的方法相比,或者使用一个静态方法创建一个静态类有什么好处呢 Ninject模块是用于向IoC容器注册各种类型的工具。这样做的好处是,这些模
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>();
}
}
在这一点上,构建ClassC是一件痛苦的事情,因为它具有多个深度的接口。只要求内核提供一个IInterfaceC要容易得多
var newc = ApplicationScope.Kernel.Get<IInterfaceC>();
var newc=ApplicationScope.Kernel.Get();
也许我遗漏了一些明显的东西
但这有什么好处呢
而不仅仅是创建一个普通的旧类
调用它的方法,或者调用
使用静态方法的静态类
是的,您可以只调用一组Bind().To()
语句来设置绑定,而不需要模块
不同之处在于,如果将这些语句放在模块中,则:
可以通过反射动态发现这些模块并加载它们IKernel.Load(IEnumerable)
- 绑定在一个名称下逻辑地分组在一起;您可以使用此名称通过
IKernel.unload(string)
在许多DI框架中,您可以将用于测试的生产模块与覆盖mockobjects的特定绑定的测试模块一起使用(保留其余的连接)。这些可能是系统测试而不是单元测试,但我倾向于比普通开发人员更高级别的测试,因为它测试类之间的集成,对于加入项目并能够看到整个功能(而不仅仅是功能的一部分)的人来说,这是一个很好的文档无需设置整个系统。)LinqToSqlDataContextModule应扩展StandardModule?@Mark Gibaud不在Ninject 2中。StandardModule已经消失,取而代之的是NinjectMdule——这是一个很好的例子,但可测试性呢?我经常听到DI/IoC容器如何帮助我提高可测试性,但我很难找到一个真实的例子来展示Ninject不会污染我的代码,也不会促进可测试性。是否有任何真实世界的开源项目可以让我了解这个想法?另一个问题是Ninject文档。那些家伙会提供这样的东西吗?Ninject目前是2.0版,我甚至找不到1.0版的可靠文档。@Piotr Owsiak什么Ninject文档?:)
var newc = ApplicationScope.Kernel.Get<IInterfaceC>();