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){}
}
ClassCの構築は、インターフェースの深さが複数あるため、現時点では苦痛です。カーネルにIInterfaceCを要求する方がはるかに簡単です。
var newc = ApplicationScope.Kernel.Get<IInterfaceC>();