個別のサービス レイヤーを使用しなくても、DI を使用して MVC アプリケーションを DAL プロジェクトから分離するという目的を達成できます。
これを行う方法は、定義したインターフェイスの特定のインスタンスを使用して IoC コンテナーを接続する間に、いくつかのプロジェクト/アセンブリを追加することです。
私は通常、次の命名規則を使用します。
メイン MVC プロジェクトは、Abstract および Infrastructure プロジェクトへの参照を持ちます。インフラストラクチャ プロジェクトには、Abstract への参照と、Business および DAL プロジェクトのようなインスタンス固有のプロジェクトがあります。インフラストラクチャ プロジェクト内で、依存関係を結び付けます。
インフラストラクチャ アセンブリで IoC をブートストラップするには、MVC プロジェクトのメカニズムをセットアップする必要があります。これは、global.asax または App_Start メソッドとして実行し、Infrastructure アセンブリ内で Registration クラスを呼び出すことができます。
StructureMap を使用していますが、コンセプトは同じです。ここにいくつかのサンプルコードがあります。
MVC アプリで、App_Start メソッドを作成して DI をセットアップします。
public static class StructuremapMvc
{
public static void Start()
{
// Create new Structuremap Controller factory so Structure map can resolve the parameter dependencies.
ControllerBuilder.Current.SetControllerFactory(new StructuremapControllerFactory());
IContainer container = IoC.Initialize();
DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
}
}
インフラストラクチャ アセンブリで、依存関係を結び付けます。
public static class IoC
{
public static IContainer Initialize()
{
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
x.For<IRepositoryNum1>().Use<Num1Repository>();
x.For<IRepositoryNum2>().Use<Num2Repository>();
x.For<IRepositoryNum3>().Use<Num3Repository>();
});
return ObjectFactory.Container;
}
}