あなたの質問は
「別のDIツール(SimpleInjector、Unity、Autofacなど)をOnionプロジェクトに統合するにはどうすればよいですか?」
Ninjectの代わりにStructureMapを使用しています。統合された方法は、他のDIフレームワークでも問題ないはずです。
あなたが言ったように、依存関係解決レイヤーだけが他のすべてのレイヤーを参照する必要があります。それはあなたのオニオンアーキテクチャの最外層です。そうするために、 BootStrapperというプロジェクトを作成しました。これは、StructureMapアセンブリを参照する唯一のプロジェクトです。このプロジェクトのApp_Startフォルダーには、次のようなStructureMapMvc.csという名前のファイルがあります。
[assembly: WebActivator.PreApplicationStartMethod(typeof(XXXX.BootStrapper.App_Start.StructuremapMvc), "Start")]
namespace XXXX.BootStrapper.App_Start
{
public static class StructuremapMvc
{
public static void Start()
{
IContainer container = IoC.Initialize();
System.Web.Mvc.DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapHttpDependencyResolver(container);
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}
}
}
興味深い行は次のとおりです。
[assembly: WebActivator.PreApplicationStartMethod(typeof(XXXX.BootStrapper.App_Start.StructuremapMvc), "Start")]
ナゲットパッケージの説明によると:
WebActivatorは、他のパッケージがWebアプリでスタートアップコードを実行できるようにするNuGetパッケージです。
かなりかっこいいですね 最後に配置する必要があるのは、BootStrapperプロジェクトアセンブリがWebアプリケーションの/ binフォルダーにプッシュされることを確認することです(ビルド後のアクションまたはOutputToナゲットパッケージを使用して簡単にセットアップできます)。これにより、MVCプロジェクトでBootStrapperプロジェクトを参照したり、OnionArchitectureの原則に違反したりする必要がなくなります。
したがって、これらすべてが整っていると、コンポジションルートパターンに完全に準拠し、アプリが起動すると、モジュールが一緒にコンポジションされます。
お役に立てれば!