2008-09-22 19 views
14

隨着.NET 3.5和IQueryable<T>界面的推出,將出現新的模式。雖然我看到了規範模式的許多實現,但我還沒有看到使用這種技術的許多其他模式。 Rob Conery的Storefront應用程序是使用IQueryable<T>的另一個具體示例,可能會導致一些新的模式。使用IQueryable的設計模式<T>

從有用的IQueryable<T>界面出現了哪些模式?

回答

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; 
7

我喜歡的庫過濾器模式。它允許您在不犧牲性能的情況下將中間層和數據端層的問題分開。

你的數據層可以專注於簡單的列表,獲取保存樣式的操作,而你的中間層可以利用擴展的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); 
} 

這是一個簡單的例子,但可以安全地組合過濾器來構建更復雜的查詢。性能被保存,因爲只有在查詢中內置了所有過濾器之後,該列表才能實現。

我喜歡它,因爲我不喜歡特定於應用程序的存儲庫!

+0

十字型過濾器怎麼樣?我的意思是,如果你想要`代碼`這樣的東西,怎麼辦?IQueryable things2 = repo.GetThings()。ForUserId(userId).GetSubthings()`code`?你會使GetSubthings()如下所示:`code`GetSubThings(this IQueryable things,IQueryable subthings){}`code`? – mayu 2011-07-13 01:45:43