天天看點

EntityFramework中使用Repository裝飾器

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

EntityFramework中使用Repository裝飾器
EntityFramework中使用Repository裝飾器

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

EntityFramework中使用Repository裝飾器
EntityFramework中使用Repository裝飾器

進而使與資料庫相關的操作在 Bisuness Logic 中呈現的非常簡單。

例如,通過一系列封裝,我們可以達到如下效果:

EntityFramework中使用Repository裝飾器
EntityFramework中使用Repository裝飾器

查詢操作也是一句話搞定:

假設有一個新的需求:要求在應用層面記錄對每個 Table 的 CRUD 的次數。

這時,有幾種辦法:

應用程式的 Business Logic 中自己記錄,比如調用 Update() 操作後記錄。

使用 AOP 模式,在調用 CRUD 方法時注入計數器。

修改 Repository<T> 實作,在每個方法中嵌入計數器。

繼承 Repository<T> 類,在衍生類中嵌入計數器。

使用裝飾器模式封裝 Repository<T>,在新的 RepositoryDecorator<T> 類中嵌入計數器。

考慮到前三種方法均需要改動已有代碼,主要是涉及的修改太多,所有沒有嘗試采用。

方法 4 則要求修改 Repository<T> 的實作,為 CRUD 方法添加 virtual 關鍵字以便擴充。

方法 5 不需要修改 Repository<T> 的實作,對已有代碼的改動不大。

綜上所述,我們選擇了方法 5。

為便于以後的擴充,建立一個裝飾器的抽象類。

EntityFramework中使用Repository裝飾器
EntityFramework中使用Repository裝飾器

可以看到,RepositoryDecorator<T> 類型仍然實作了 IRepository<T> 接口,對外使用沒有任何變化。

我們定義一個 CountableRepository<T> 類用于封裝 CRUD 計數功能,其繼承自 RepositoryDecorator<T> 抽象類。

EntityFramework中使用Repository裝飾器
EntityFramework中使用Repository裝飾器

我們在 override 方法中,添加了 CRUD 的計數功能。這裡的代碼簡寫為:

對原有代碼的修改則是需要注冊新的 CountableRepository<T> 類型。

EntityFramework中使用Repository裝飾器
EntityFramework中使用Repository裝飾器

既然有了抽象基類 RepositoryDecorator<T> ,我們可以從其設計衍生多個特定場景的 Repository 。

比如,當我們需要為某個 Table 的 Entity 添加緩存功能時,我們可以定制一個 CachableRepository<T> 來完成這一個擴充。

本文轉自匠心十年部落格園部落格,原文連結:http://www.cnblogs.com/gaochundong/p/entityframework_repository_decorator.html,如需轉載請自行聯系原作者