隨着.NET 3.5和IQueryable<T>
界面的推出,將出現新的模式。雖然我看到了規範模式的許多實現,但我還沒有看到使用這種技術的許多其他模式。 Rob Conery的Storefront應用程序是使用IQueryable<T>
的另一個具體示例,可能會導致一些新的模式。使用IQueryable的設計模式<T>
從有用的IQueryable<T>
界面出現了哪些模式?
隨着.NET 3.5和IQueryable<T>
界面的推出,將出現新的模式。雖然我看到了規範模式的許多實現,但我還沒有看到使用這種技術的許多其他模式。 Rob Conery的Storefront應用程序是使用IQueryable<T>
的另一個具體示例,可能會導致一些新的模式。使用IQueryable的設計模式<T>
從有用的IQueryable<T>
界面出現了哪些模式?
它確實使存儲庫模式更容易實現。你基本上可以創建一個通用的存儲庫:
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;
我喜歡的庫過濾器模式。它允許您在不犧牲性能的情況下將中間層和數據端層的問題分開。
你的數據層可以專注於簡單的列表,獲取保存樣式的操作,而你的中間層可以利用擴展的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);
}
這是一個簡單的例子,但可以安全地組合過濾器來構建更復雜的查詢。性能被保存,因爲只有在查詢中內置了所有過濾器之後,該列表才能實現。
我喜歡它,因爲我不喜歡特定於應用程序的存儲庫!
十字型過濾器怎麼樣?我的意思是,如果你想要`代碼`這樣的東西,怎麼辦?IQueryable things2 = repo.GetThings()。ForUserId(userId).GetSubthings()`code`?你會使GetSubthings()如下所示:`code`GetSubThings(this IQueryable things,IQueryable subthings){}`code`? –
mayu
2011-07-13 01:45:43