以下の設計問題について、皆様のご意見をいただければ幸いです。
「個人」または「ビジネス」のいずれかが特定の「サービス」のプロバイダーである可能性があるモデルがあります。クラス定義の例を以下に示します。
IProviderGUIDID
_ _
担当者:IProvider
Guid Id
string FirstName
string LastName
ビジネス:
IProviderGuidId文字
列名
サービスガイド
IDIProvider
プロバイダー_
したがって、私は自分のドメインに関連する概念、「個人」、「ビジネス」、「IProvider」、および「サービス」を作成しました。私が苦労しているのは、リポジトリを作成するエンティティです。このコンテキストでは、「サービス」は集約ルートであるため、独自のリポジトリがあります。「ビジネス」は、プロバイダーでなくても意味があるため、私のコンテキストでは集約ルートでもあります。「個人」は、「プロバイダー」である場合にのみシステムに作成されます。
'Person'と'Business'のインスタンスを返すIProviderの役割のリポジトリを作成しますか。これに関する私の問題は、実装がすべての異なるタイプのIProviderを返すために複数のテーブルなどを調べる必要があるため、コードがすぐに非常に複雑になる可能性があることです。このようなアプローチでは、必要な機能を提供するために、「Person」および「Business」のリポジトリを作成して「IProvider」リポジトリに挿入する必要があります。
public class ProviderRepository : IProviderRepoistory
{
public IBusinessRepository businessRepository {get; set; }
public IPersonRepository personRepository {get; set; }
public IProvider FindById(Guid Id){
IProvider entity = businessRepository.FindById(Id);
if(entity == null)
entity = personRepository.FindById(Id);
return entity;
}
}
もう1つのアプローチは、「IProvider」インターフェースを実装する「Person」および「Business」エンティティのリポジトリを作成し、それらをその役割に参加できるようにすることです。すなわち
public class PersonRepository : IPersonRepository, IProviderRepository
{
private ISession session;
public Person FindById(Guid Id){
return session.Query<Person>().FirstOrDefault<Person>(x => x.Id == Id);
}
public IProvider FindById(Guid Id){
return session.Query<Person>().FirstOrDefault<Person>(x => x.Id == Id && x.IsProvider == true);
}
}
次に、メカニズム(つまり、IoCコンテナー)を使用して、必要に応じてIProviderRepositoryの正しい具体的な実装を選択します。たとえば、私が個人であることがわかっているプロバイダーと取引している場合、PersonRepository実装を取得できます。
もう1つのオプションは、IProviderリポジトリを実装せず、「Person」および「Business」リポジトリに固執し、サービスレイヤーで必要に応じてそれらを使用することです。