14

.NET 3.5 とインターフェイスの導入によりIQueryable<T>、新しいパターンが出現します。仕様パターンの実装は数多く見てきましたが、この技術を使用した他の多くのパターンは見たことがありません。Rob Conery の Storefront アプリケーションはIQueryable<T>、いくつかの新しいパターンにつながる可能性のある別の具体的な使用例です。

IQueryable<T>便利なインターフェースからどのようなパターンが生まれましたか?

4

2 に答える 2

8

確かに、リポジトリ パターンの実装もはるかに簡単になりました。基本的に、汎用リポジトリを作成できます。

public class LinqToSqlRepository : IRepository
{
   private readonly DataContext _context;

   public LinqToSqlRepository(DataContext context)
   {
       _context = context;
   }

   public IQueryable<T> Find<T>()
   {
       return _dataContext.GetTable<T>(); // linq 2 sql
   }

   /** snip: Insert, Update etc.. **/
}

そしてそれをlinqで使用します:

var query = from customers in _repository.Find<Customer>() 
            select customers;
于 2008-09-22T12:39:40.463 に答える
7

リポジトリ フィルター パターンが気に入っています。これにより、パフォーマンスを犠牲にすることなく、中間層およびデータ エンド層から懸念事項を分離できます。

データ レイヤーは単純な list-get-save スタイルの操作に集中できますが、中間層は IQueryable の拡張機能を利用してより堅牢な機能を提供できます。

リポジトリ (データ層):

public class ThingRepository : IThingRepository
{
    public IQueryable<Thing> GetThings()
    {
        return from m in context.Things
               select m; // Really simple!
    }
}

フィルター (サービス層):

public static class ServiceExtensions
{
    public static IQueryable<Thing> ForUserID(this IQueryable<Thing> qry, int userID)
    {
        return from a in qry
               where a.UserID == userID
               select a;
    }
}

サービス:

public GetThingsForUserID(int userID)
{
    return repository.GetThings().ForUserID(userID);
}

これは単純な例ですが、フィルターを安全に組み合わせて、より複雑なクエリを作成できます。すべてのフィルターがクエリに組み込まれるまでリストは具体化されないため、パフォーマンスは維持されます。

私はアプリケーション固有のリポジ​​トリが嫌いなので、気に入っています!

于 2009-03-14T14:09:42.760 に答える