個別のサービスレイヤーを使用しない場合でも、DIを使用してMVCアプリケーションとDALプロジェクトを切り離すことができます。
これを行う方法は、IoCコンテナの上に定義したインタフェースの特定のインスタンスを結ぶ2つのプロジェクト/アセンブリを追加することです。
私は通常、この命名規則を使用します。
あなたの主なMVCプロジェクトは、その後への参照を持っているでしょう抽象プロジェクトとインフラストラクチャプロジェクト。インフラストラクチャプロジェクトには、ビジネスプロジェクトや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;
}
}
レポを使用しても、DIを使用する必要はありません.2つの異なる問題を解決します。 –
私は "タマネギの建築"を読んでみることをお勧めします、私はそれがプロジェクトの参考に良いアプローチだと思います。あなたのUIとDataAccessのレイヤーはどちらも外部にあるので、お互いを参照する上で問題はありません。 – Charlino