2011-10-27 5 views
2

ジェネリックリポジトリパターンを使用する場合は、タイプ固有の機能を配置する場所が最適です。ジェネリックリポジトリを使用しているときに 'タイプ'の特定の機能を配置する場所

一般的なRepository<T>には、GetMany()などのメソッドがありますが、タイプに固有の関数を配置する最も賢明な場所はどこですか?

単純な例として、「User」タイプがあり、ユーザーのファーストネーム/ラストネームを戻してオブジェクトセットが返されたときにそれらを一緒に接着する必要がある関数が必要な場合、 FirstName + " " + LastNameを「Username」と返すことができます。

私が継承した以前の非リポジトリパターンの実装では、これらの拡張メソッドを提供するためにEFタイプの部分クラスが使用されていましたが、これらのタイプの関数をリポジトリを使用する場所に移動する場所は少し不明です。

すべてのアイデアは、

乾杯、

ダグ下記のリンクではなく、一般的なリポジトリの契約を広げる、選択を指定する方法について説明し

+1

特定の実装が必要な場合は、なぜ汎用リポジトリを使用していますか? – alexn

+0

LINQの 'Select'メソッドでグルーすることができます:' from p in repository.GetMany select new {UserName = p.FirstName + "" + p.LastName}; –

+0

@alexn一般的なリポジトリが遭遇した状況に対応する時間の90%が90日間の別の実装にうまくいかないような「追加」などの基本機能の繰り返しを保存するためです。私たちが持っているエンティティタイプ。 – dougajmcdonald

答えて

4

大きな助けとなり、一般的な手法はにあります特定のリポジトリ

EF POCO

public class CustomerRepository : GenericRepository<Customer>, ICustomerRepository 
{ 
    public CustomerRepository(ObjectContext context) : base(context) { } 

    public IList<Customer> NewlySubscribed() 
    { 
     var lastMonth = DateTime.Now.Date.AddMonths(-1); 

     return GetQuery().Where(c => c.Inserted >= lastMonth) 
     .ToList(); 
    } 

    public Customer FindByName(string firstname, string lastname) 
    { 
     return GetQuery().Where(c => c.Firstname == firstname && c.Lastname == lastname).FirstOrDefault(); 
    } 
} 
を実装するために、一般的なリポジトリをサブクラス化あなたがNewlySubscribed(のために使用されるものとして、あなたの関数を追加することができます

+0

ありがとう@SShebly、このメソッドは、私たちが望むように動作し、ジェネリックリポジトリの柔軟性を保持しながら型固有の操作をパッケージ化する良い方法を提供します。 – dougajmcdonald

3

私は似た何かを作成しているが、すべて私のタイプの特定のものがRepository<T>から派生したサブクラスです。一般的なものは一般的なままでなければなりません。特定のものを入力すると型付きレポになります。

関連する問題