1

以下の設計問題について、皆様のご意見をいただければ幸いです。

「個人」または「ビジネス」のいずれかが特定の「サービス」のプロバイダーである可能性があるモデルがあります。クラス定義の例を以下に示します。

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」リポジトリに固執し、サービスレイヤーで必要に応じてそれらを使用することです。

4

1 に答える 1

0

私はあなたがそれを考えすぎていると思います、そしてあなたはあまりにも早く最適化しようとしています。

ここであなたが言ったことすべてから、PersonとBusinessは両方ともエンティティであるように思えますが、どちらも集合体ではありません(もちろん、ドメインの専門家との議論で何かが欠けている可能性があります)。プロバイダーは集合体であるように私には思えます。

ProviderRepositoryを構築する場合、企業や個人のリポジトリを注入する必要はありません。集約されていない場合は、独自のリポジトリを使用しないでください。代わりに、ProviderRepositoryはSessionを直接使用して、特定のクエリの問題のエンティティを構成するために思いついたDBスキーマから必要なものをフェッチする必要があります。継承を正しくマップすると、基本クラスまたはインターフェイスでクエリを実行できます。

于 2011-05-19T14:35:11.667 に答える