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