C# Ninject模块的意图是什么?

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完全是个新手

我一直在分解其他人的代码,发现了几个nInject模块的实例——这些类派生自nInject.modules.Module,并且有一个包含大部分代码的加载方法

通过调用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>();
    }
}
在这一点上,构建ClassC是一件痛苦的事情,因为它具有多个深度的接口。只要求内核提供一个IInterfaceC要容易得多

var newc = ApplicationScope.Kernel.Get<IInterfaceC>();
var newc=ApplicationScope.Kernel.Get();
也许我遗漏了一些明显的东西 但这有什么好处呢 而不仅仅是创建一个普通的旧类 调用它的方法,或者调用 使用静态方法的静态类

是的,您可以只调用一组
Bind().To()
语句来设置绑定,而不需要模块

不同之处在于,如果将这些语句放在模块中,则:

  • IKernel.Load(IEnumerable)
    可以通过反射动态发现这些模块并加载它们
  • 绑定在一个名称下逻辑地分组在一起;您可以使用此名称通过
    IKernel.unload(string)
也许我在这里遗漏了一些明显的东西,但是与仅仅创建一个普通的旧类并调用它的方法相比,或者使用一个静态方法创建一个静态类有什么好处呢

对我们来说,这是一种在以后很容易添加测试的能力。只要用mockobjects覆盖一些绑定,瞧……在没有连接“一切”的DI的遗留代码上,几乎不可能在不进行一些返工的情况下开始插入测试用例。有了DI,只要它在DI连接所有东西的地方正确使用,即使在可能非常难看的遗留代码上也很容易做到这一点


在许多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>();