私は開発中のアプリケーションをモジュラーアプリケーションの設計に従っています。認証/承認、ロギング、データアクセスなどの共通の中央サービスを提供する「コア」垂直スタックがあります。コンテキスト固有の領域は、同じ論理層のコアアセンブリを参照するモジュールで実装されます。モジュラーアプリケーションアーキテクチャでのタイプの共有
アプリケーションは、ファサードレイヤ、ドメインレイヤ、およびデータアクセスコードを含むインフラストラクチャコードを持つサービスアプリです。各モジュールはドメイン層アセンブリを実装します。モジュールにパブリックAPIがある場合は、ファサードアセンブリも実装されます。例えば
、解決策は含まれています
(など - モジュールB(参照Core.Api)
これは、IoCコンテナとしてのUnityを持つDIを使用して結合されています。 WebHostプロジェクトでは、さまざまな実装が完全に埋め込まれたインターフェイスにマッピングされる構成が定義されています。
このアプローチは単なる論理的な目的ではなく、実装の柔軟性を可能にする(つまり、他のコードを壊すことなく、または他のコードに触れることなくモジュールの実装を変更することができます)。また、チーム間で作業を分割し、他のコードの回帰エラーのリスクがほとんどない新しいモジュールでアプリケーションを拡張することも非常に簡単です。
ModuleBにModuleAで定義されている1つ以上のタイプが必要な場合、私の質問は何ですか? ModuleBがModuleAを参照することは許容されますか、またはModuleAをCoreに移動する必要がありますか?私はこの明確に私をリードガッチャに走って以下に説明変更の一部を実装を見て
UPDATE
...
私のモジュールは相互依存している2つの場所があります。 。以下で説明するアプローチに従って、私が共有したいインターフェイスとタイプをModule1からCoreに移動できます。これにより、ModuleBはModuleAとModuleBを緊密に結合することなく使用できます。ただし、ModuleB.Apiのサービス操作でModuleA.Apiで定義されたデータコントラクトの一部を使用する必要もあります。これは私にデザインに疑問を投げかけます。
IPのため、正確な使用例は記述できませんが、ModuleAにはEntityAドメインオブジェクトがあるといっても過言ではありません。 ModuleA.ApiはパブリックAPIによって公開されるEntityContractAデータコントラクト(DTO)を定義します。 ModuleB。Apiには、パラメータとしてEntityContractAを必要とするメソッドがあり、次に、パラメータとしてEntityAを受け付けるModuleBのメソッドに委譲します。
この場合も、EntityAをコアに移動すると、ドメインレイヤの問題は解決されますが、ファサードレイヤでは役に立ちません。 EntityContractAをCore.Apiに移動すると、全体的なにおいがしやすくなります。
ここで私は達成するために必要なものの例です:
をModuleB.Api.ServiceFacadeBで:
のDomainServiceがModuleA.ServiceBあるpublic EntityContractB FilterBy(EntityContractA contractA)
{
var entityA = Mapper.Map<EntityContractA, EntityA>(contractA);
var entityB = domainService.FilterBy(entityA);
var contractB = Mapper.Map<EntityB, EntityContractB>(entityB);
return contractB;
}
:
public EntityB FilterBy(EntityA entityA)
{
// Do work
}
どうやってそれらをコアに移動することになりますか?あなたが使用するインタフェースとタイプだけを定義し、実装をモジュールのままにしますか? – SonOfPirate
私は(現実的ではないが)現在のアーキテクチャでは、実装が概念的にはインタフェースと同じ名前空間に実装されている必要があると思います。つまり、Module1からCoreに完全に移動する必要があります。 – kroonwijk
IoCコンテナを使用する場合、このような制約はないと思います。私はすでにインターフェイスを実装している私のすべての「サービス」を持っています。もっと考えると、「契約」(インターフェイス)とサポートタイプをコアに置き、実装を別のモジュールに残すほうが意味があります。これにより、両方のモジュールがCoreを参照するだけで済みますが、実装でモジュール性の利点を得ることができます。 – SonOfPirate