Dependency Inversion Principle に従い、流暢に構成された Dependency Injection (DI) コンテナーを利用する MVC 4 Web ソリューションを設計する方法を研究してきました (つまり、コンパイル時の型チェックを使用)。
ASP.NET MVC 4 依存性注入の多くの例は、MVC フレームワークが提供するエントリ ポイントに DI を実装するための詳細に焦点を当てていることがわかりました。結果として得られる階層化されたアプローチ (赤い矢印で示される依存関係) に引き寄せられ ます。残念ながら、これは、高レベルのモジュールが低レベルのモジュールに依存するという従来の依存関係モデルを繰り返します。依存性逆転の原則に従って、IService インターフェイスは WebProject に移動されます。残念ながら、これにより 2 つのプロジェクト間に循環参照が作成されます。循環参照 を回避するために、CompositionRoot は独自のプロジェクトに移動されます。
コンテナーをブートストラップする方法の問題が残っています (WebProject 内から直接参照することはできません)。
アセンブリが初期化を実行しているディレクトリを取得するための最良の方法の助けを借りて、リフレクションを使用して実現できます。
var assembly = System.Reflection.Assembly.LoadFile(Helper.AssemblyDirectory + "/DependencyInjectionProject.dll");
var type = assembly.GetType("DependencyInjectionProject.Bootstrapper");
IDependencyResolver resolver = (IDependencyResolver)type.GetMethod("Initialise").Invoke(null, null);
DependencyResolver.SetResolver(resolver);
ビルドを簡単にするために、DependencyInjectionProject のビルド ターゲットを WebProject の bin ディレクトリに設定しました。目的を達成しました。依存関係を反転し、コンパイル時にコンテナー構成をチェックしましたが、IIS Express で WebProject を実行するときにビルド ターゲットの競合が頻繁に発生するため、このアプローチには完全に満足していません。
これらの要件を満たすための他の経験やアプローチを聞くことに非常に興味があります。コンパイル時の構成をやめて、テキストベースの構成を採用する必要がありますか? 私が見ていない循環依存の落とし穴を回避するレイヤーの明らかな構造はありますか?