2009-10-15 91 views
3

我正嘗試使用角色表,用戶表和具有userid,roleid的外部參照表來實現用戶認證和授權。存儲庫模式和Linq到sql

爲了實現通用repoistory更新角色,插入角色,添加用戶,添加用戶角色,更新用戶,更新用戶角色,驗證用戶,添加用戶會話審計等我有寫每個獨立的函數或我可以爲類似的功能使用一種通用方法。 還有一些其他操作,如加入用戶到其他表,並根據條件得到前5行,插入3表(使用單一形式插入一個鍵)等

我很困惑閱讀許多文章和樣品,bcos除了CRUD操作之外,我看到的樣本並未深入實施。

有人可以指導我或指導我一個很好的樣品/文章?

回答

7

首先,遵循什麼弗蘭克Schwieterman說。讓您的存儲庫隨着其使用量的增長而增長。另外,瞭解並使用IQueryable接口。 L2S,Entity Framework,LINQ to nHibernate,以及一些較新的ORM(如SubSonic和Telerik的ORM)都支持IQueryable接口。

在您需要存儲庫中的可變查詢但仍希望交換OR映射器(如果需要)的好處的情況下,IQueryable是一個強大的工具。假設如下:

public class ProductRepository: IProductRepository 
{ 
    public Product GetByID(int id); 
    public IList<Product> GetAll(); 
    public void Insert(Product product); 
    public Product Update(Product product); 
    public void Delete(Product product); 
} 

這是一個相當常見的存儲庫,只有普通的方法。隨着時間的推移,你最終可能會和一幫更多的方法:

public IList<Product> GetByOrder(Order order); 
public IList<Product> GetByCategory(Category category); 
public IList<Product> GetByQuantityInStock(int quantityInStock); 

這也是很常見的,取決於你怎麼樣來解決這個問題,完全可以接受。但是,從長遠來看,您的存儲庫可能會變得笨重,其界面將一直在變化。你也失去了在幕後使用OR映射器的真正好處。

你可以保持原始的,簡單的存儲庫接口,但仍然提供了自己一個很大的靈活性,如果你改變了一個方法:

public IQueryable<Product> GetAll(); 

你的庫現在返回查詢,而不是已經列表檢索的對象。現在,您可以自由使用該查詢像任何其他支持LINQ對象:

var productsWithLowStock = productRepository.GetAll().Where(p => p.Quantity < 10); 

var orders = orderRepository.GetAll(); 
var productsWithOrders = productRepository.GetAll().Where(p => orders.OrderLines.Any(ol => ol.ProductID == p.ProductID)); 

一旦你開始使用的IQueryable接口與你的資料庫,您獲得兩全其美的:在你的下級數據A mockable抽象訪問以及代碼中動態查詢的功能。你可以把這個概念做得更遠一些,並創建一個基本的Repository類,它實現了IQueryable本身,允許你消除對GetAll()調用的需要,並且直接查詢存儲庫(雖然具有其他複雜程度)。

+0

這種方法遇到的問題是何時調用dispose。出於這個原因,我通常有兩個存儲庫接口,一個是IQueryable類型訪問器(支持IDisposeable,其生命週期必須由調用者管理),另一個用於寫入或其他複雜操作,其中每個調用在內部使用一個數據上下文。 – 2009-10-16 22:26:56

1

理想情況下,您不應該猜測存儲庫的需求。一種方法是先編寫使用存儲庫的代碼,根據需要擴展存儲庫的接口。如果你編寫爲存儲庫提供測試雙打的單元測試,這是可以實現的。

-2

linq2sql是ActiveRecord模式的一種實現,它有點反模式,所以如果你想使用存儲庫模式,那麼你不能使用linq2sql,但可以有其他可以分離關注的東西(單獨的類爲實體和單獨的類數據訪問)

或可能是你能以某種方式,我不知道這件事:d

+1

在L2S中使用存儲庫模式是絕對有可能的。 L2S也支持POCO設計,允許您通過映射和通用的DataContext方法讓您的域類型與持久性問題分離。 L2S的主要限制是支持多種映射......它通常與數據庫表一一對應。但是,這當然不排除使用存儲庫。 – jrista 2009-10-15 17:00:21

+0

很酷,你能給我一個鏈接在哪裏顯示如何使用Linq2SQL或城堡ActiveRecord或亞音速等/任何東西的存儲庫模式的實現 – Omu 2009-10-15 17:07:03

+0

有這麼多可用, http://www.google.com/search?hl = en&q = repository + patterns + Linq + 2 + sql&aq = f&oq =&aqi = – 2009-10-15 17:09:20