通常在使用 EntityFramework 時,我們會封裝出 IRepository 和 IUnitOfWork 接口,前者負責 CRUD 操作,後者負責資料送出 Commit。


然後,通過使用 Unity IoC 容器來注冊泛型接口與實作類型。


進而使與資料庫相關的操作在 Bisuness Logic 中呈現的非常簡單。
例如,通過一系列封裝,我們可以達到如下效果:


查詢操作也是一句話搞定:
假設有一個新的需求:要求在應用層面記錄對每個 Table 的 CRUD 的次數。
這時,有幾種辦法:
應用程式的 Business Logic 中自己記錄,比如調用 Update() 操作後記錄。
使用 AOP 模式,在調用 CRUD 方法時注入計數器。
修改 Repository<T> 實作,在每個方法中嵌入計數器。
繼承 Repository<T> 類,在衍生類中嵌入計數器。
使用裝飾器模式封裝 Repository<T>,在新的 RepositoryDecorator<T> 類中嵌入計數器。
考慮到前三種方法均需要改動已有代碼,主要是涉及的修改太多,所有沒有嘗試采用。
方法 4 則要求修改 Repository<T> 的實作,為 CRUD 方法添加 virtual 關鍵字以便擴充。
方法 5 不需要修改 Repository<T> 的實作,對已有代碼的改動不大。
綜上所述,我們選擇了方法 5。
為便于以後的擴充,建立一個裝飾器的抽象類。


可以看到,RepositoryDecorator<T> 類型仍然實作了 IRepository<T> 接口,對外使用沒有任何變化。
我們定義一個 CountableRepository<T> 類用于封裝 CRUD 計數功能,其繼承自 RepositoryDecorator<T> 抽象類。


我們在 override 方法中,添加了 CRUD 的計數功能。這裡的代碼簡寫為:
對原有代碼的修改則是需要注冊新的 CountableRepository<T> 類型。


既然有了抽象基類 RepositoryDecorator<T> ,我們可以從其設計衍生多個特定場景的 Repository 。
比如,當我們需要為某個 Table 的 Entity 添加緩存功能時,我們可以定制一個 CachableRepository<T> 來完成這一個擴充。
本文轉自匠心十年部落格園部落格,原文連結:http://www.cnblogs.com/gaochundong/p/entityframework_repository_decorator.html,如需轉載請自行聯系原作者