2012-01-09 5 views
1

: 世界 - >フランチャイズ - >オフィス - > MVC 3リポジトリ/ DALの設計方法を教えてください。次のドメインモデルで

私はリポジトリはaggrigateルートは、これらのドメインエンティティのこれは、aggrigate根を返すべきであることを理解エージェント

?またはすべて(私はそれぞれのリポジトリが必要ですか?)

urlで渡されたIDを使用してエンティティを取得したいと考えています。これらのGetByIdメソッドはどこに置くのですか?

"Jo"という部分的な名前のフランチャイズ内のすべてのエージェントのリストを取得するには、どうすればそのシステムに組み込むことができますか?私は: フランチャイズエンティティのメソッドは、基本的には.SelectMany linqステートメントですか? またはGetByPartialFirstName()メソッドを持つエージェントのリポジトリを持っていますか?

答えて

2

は、ドメインロジックに依存します"Agent"のインスタンスを取得し、コンシューマコードから直接メソッドを呼び出す場合は、独自のリポジトリを持つ必要があります。それ以外の場合は、 "Office"の一部として消費され、そのメソッドはルート "Office"から呼び出されます。これは集約ルートではなく、リポジトリから独立してフェッチする必要はありません。

このルールをすべてのエンティティに適用して、リポジトリの作成先を決定します。

+0

さて、ほぼすべてのエンティティがリポジトリクラスを持つようになり、私はこれがアンチパターンであると心配しています。 – modelMan

+0

私はそれがなぜそうであろう反パターンであるとは思わないのですか?あなたのユースケースが各エンティティをフェッチして保存するのであれば、それぞれのリポジトリが必要です –

0

リポジトリに関する経験はありませんが、エージェントを検索する方法が複数ある場合は、criteria/classを作成することをお勧めします。これにより、単一のメソッド呼び出し(firstname/lastname、firstname/cityなど)で複数のタイプの組み合わせ検索を行うことができます。エンティティは、それが集約ルートである、独自によって消費される場合は、あなたがしたい場合

(私は自分のアプリケーションやデータソースデカップリングを維持するためのインタフェースを使って好き)

public IEnumerable/IQueryable<IAgent> Get(IAgentCriteria Criteria) 
{ 
    if (Critiria == null) throw new ArgumentNullException(); 

    var result = entities.Agents; 

    if (!string.IsNullEmptyOrWhiteSpace(Criteria.FirstNameStartsWith)) 
    { 
    result = result.Where(x => x.FistName.StartsWith(Criteria.FirstNameStartsWith)); 
    } 

    // etc etc 
} 
関連する問題