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 컨테이너에서도 문제를 분리 할 수 있습니다.
질문의 나머지 부분은 Ninject가 아니라 IoC와 DI에 관한 것입니다. 예, 정적 구성 객체를 사용하여 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){}
}
Building ClassC는 인터페이스의 다중 깊이가있는이 시점에서 고통입니다. 커널에 IInterfaceC를 요청하는 것이 훨씬 쉽습니다.
var newc = ApplicationScope.Kernel.Get<IInterfaceC>();
LinqToSqlDataContextModule은 StandardModule을 확장해야합니까? –
@Mark Gibaud in Ninject 2. StandardModule이 없어지고 NinjectMdule로 바뀌 었습니다 - http://github.com/enkari/ninject/tree/master/src/Ninject/Modules/ –
그 좋은 예입니다 만, 테스트 가능성은 어떻습니까? 저는 DI/IoC 컨테이너가 테스트 가능성을 어떻게 도울 수 있는지에 대해 끊임없이 들었습니다.하지만 Ninject가 코드를 오염시키지 않고 테스트 가능성을 촉진한다는 것을 보여주는 실제 사례를 찾기가 힘듭니다. 아이디어를 얻기 위해 볼 수있는 실제 공개 소스 프로젝트가 있습니까? –