おっしゃるように、インターフェースはCore
システムとWeb
アプリケーションの間の関係を切り離すために使用されます。すべてのビジネスロジックをCore
プロジェクトのセグメント内に配置し、Web
アプリケーションにこのビジネスロジックを使用させるとすると、インターフェイスは、で公開(または実装)するコントラクトを表しますCore
。
あなたの質問のそれぞれに答えて:
1-コアプロジェクトのインターフェイスはいつ使用されますか?EFがデータベースにアクセスできるように、インターフェイスを提供しますか?
アプリケーションWeb
は、インターフェイスを使用(または消費)し、IBusinessLayer
(Entity Frameworkを介して)データストアへのアクセスを公開するアプリケーションです。
2-インターフェースは、EFが実際のデータにアクセスできるように、Coreが実装されたバージョンにアクセスするために使用する単なるプロキシですか?
はい。ただし、この場合はIDataAccessObject
、によって実装される別のインターフェイス、、について話していることになりますEFDataAccessObject
。OtherORMDataAccessObject
ここでの考え方は、将来、実装のように別のORMに切り替えてIDataAccessObject
、プロジェクトの残りの部分(Core
およびWeb
)を変更しないようにすることです。
3-もしそうなら、依存性注入はここでどのような役割を果たしますか?どのような依存関係(Webに依存するコア、コアに依存するWeb)、およびどこに、そしてなぜ注入するのですか?
依存性注入はまさにそれです。動的に構成および計算できる単一の具象型を登録することにより、これらすべてのインターフェースの実装を注入する方法です。基本的に、それぞれについて、
public WebClass
{
public IBusinessLayer BusinessLayer { get; set; } // <-- Dependency
}
public BusinessClass
{
public IProjectDB ProjectDB { get; set; } // <-- Dependency
}
...
public Main()
{
DependencyInjector
.Register<IBusinessLayer>().With<ConcreteBusinessLayer>().
.Register<IProjectDB>().With<EntityFrameworkProjectDB>();
}
..。
1-サービスレイヤーがすべてのデータアクセスを管理していると仮定すると、「ProjectDb」をサービスプロジェクトに移動できますよね?
はい。システムをレイヤーCore
の依存関係にするだけです。Service
public ServiceClass
{
public IBusinessLayer BusinessLayer { get; set; } // <-- Dependency
}
public WebClass
{
public IServiceLayer ServiceLayer { get; set; } // <-- Dependency
}
ご覧のとおり、Core
レイヤーの実装とは変更されておらず、依存関係をからにProjectDB
移動して、レイヤーに依存関係を作成しただけです。Business
Web
Service
Service
Web
2-Webはサービスにアクセスする必要があります...したがって、サービスプロジェクトに実装されるWebプロジェクトにインターフェイスを作成する必要があると考えています。別の質問では、これは間違っており、インターフェイスと定義の両方がサービスレイヤーに存在する必要があると言われました。これは、インターフェイスの目的を損なうものです。誰かが私のためにこれを明確にすることができますか?
これは前の質問と一致します:IServiceLayer
インターフェースはService
レイヤープロジェクトで定義され実装されています。このインターフェースを使用してWeb
レイヤーからサービスを利用しますが、これは依存関係にすぎません。
public WebClass
{
public IServiceLayer ServiceLayer { get; set; } // <-- Dependency
}