Ninject模块的目的是什么?

Jon*_*han 58 c# dependency-injection module ninject module-pattern

我是ninject的完全新手

我一直在拉开其他人的代码,发现了几个nInject模块实例 - 从Ninject.Modules.Module派生的类,并且有一个包含大部分代码的加载方法.

通过调用StandardKernel实例的LoadModule方法并将其传递给模块类的实例来调用这些类.

也许我在这里遗漏了一些明显的东西,但是这对于创建一个普通的旧类并调用它的方法,或者使用静态方法的静态类有什么好处呢?

 

Jar*_*yer 61

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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

拥有多个模块可以分离关注点,即使在您的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){}
}
Run Code Online (Sandbox Code Playgroud)

在这一点上构建ClassC是一种痛苦,具有多种接口深度.要求内核提供IInterfaceC要容易得多.

var newc = ApplicationScope.Kernel.Get<IInterfaceC>();
Run Code Online (Sandbox Code Playgroud)

  • @Piotr Owsiak Ninject的文档是什么?:) (2认同)

Wim*_*nen 9

也许我在这里遗漏了一些明显的东西,但是这对于创建一个普通的旧类并调用它的方法,或者使用静态方法的静态类有什么好处呢?

是的,你可以调用一堆Bind<X>().To<Z>()语句来设置绑定,而不需要模块.

不同之处在于,如果您将这些语句放在一个模块中,那么:

  • IKernel.Load(IEnumerable<Assembly>) 可以通过反射动态发现这些模块并加载它们.
  • 绑定在名称下逻辑分组在一起; 您可以使用此名称再次卸载它们IKernel.Unload(string)