我是一个完整的新手而来

我已经拉开他人的代码,发现几个实例而模块课程,从而.模块。模块,并有一个装载方法,包含大多数的代码。

这些课程被称为可通过调用LoadModule方法的一个实例StandardKernel和传递一个实例的模块课。

也许我失去了一些东西,显而易见的,但是什么的利益,这只是创造一个普通的老类并呼吁它的方法,或者也许是一个静态的类有一个静态的方法?

 

有帮助吗?

解决方案

在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容器。

这是你的问题,其余听起来像它更多的是国际奥委会和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)
  

也许我缺少明显的东西在这里,但这个又是什么在刚刚创建一个普通的老类和调用它的方法,或者一个静态类,其静态方法的好处?

对于我们来说,这是在以后的时间添加测试很容易的能力。只要覆盖与mockobjects几个绑定,瞧.....上没有这种有线“一切”了DI遗留代码,这几乎是不可能开始没有一些返工插入测试用例。随着地方,只要一个DI,因为它是使用得当,其中DI有线的一切行动,这是非常简单的事所以即使在旧代码,可能是非常难看。

在许多DI框架,你可以使用生产模块与测试模块,覆盖与mockobjects特定的绑定(离开布线的休息的地方)测试。这些可能是系统测试比单元测试更多,但我倾向于选择比一般的开发商更高的水平测试,其测试类之间的整合,这是人谁加入该项目,并能看到活动的整体特征(而不是巨大的文档的只是该特征的部分),而不必设置一个整体的系统)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top