什么是有意的而模块?
-
20-09-2019 - |
题
我是一个完整的新手而来
我已经拉开他人的代码,发现几个实例而模块课程,从而.模块。模块,并有一个装载方法,包含大多数的代码。
这些课程被称为可通过调用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特定的绑定(离开布线的休息的地方)测试。这些可能是系统测试比单元测试更多,但我倾向于选择比一般的开发商更高的水平测试,其测试类之间的整合,这是人谁加入该项目,并能看到活动的整体特征(而不是巨大的文档的只是该特征的部分),而不必设置一个整体的系统)。