Entity Framework Generic Repository Library
在使用Entity Framework設計應用程式時,Repository樣式是一種目前常用的設計樣式,用來封裝EF與Business Model存取模式.
Repository樣式的主要優點如下
1.易於測試
2.集中管理與分組,將商業邏輯與資料存取分離,提高可讀性與更好維護
3.可以方便施行如Caching機制
目前在網路上已有很多文章介紹Repository樣式之應用,也有不少文章針對Repository樣式用於Entity Framework的方式.底下幾個連結可以參考
1.http://msdn.microsoft.com/en-us/library/ff649690.aspx
雖然文章與範例很多但在實際應用上都僅能做為參考的設計方式,無法直接拿來使用.
故撰寫了一個通用型的應用於Entity Freamework的Repository Library作為分享.
下載:https://dotblogsfile.blob.core.windows.net/user/programlin/1109/201193010225884.zip
此Library的特點如下
1.支援多種Lifetime模式,譬如httpcontext,thread等
2.UnitofWork容器可以程式化跨各個Repository之間.
3.使用T4 Template,支援.edm與.csdl自動化產生相關程式碼,大大降低使用Repository要寫一堆Code的問題.
4.使用Unity Library,透過Ioc可以動態的抽換或擴展一些應用.
以上的特點後續文章會再持續說明.
底下為基本的使用方式說明
這邊以標準的Northwind資料庫做為展示資料 (完整專案可於下載網址中的demp1.zip取得)
下載專案:https://dotblogsfile.blob.core.windows.net/user/programlin/1109/2011930102310432.zip
開啟專案結構如下
其中參考引用Repository Library中的Plin.Repository.dll,Plin.Data.Entity.dll
而EFRepository.tt為產生通用class的T4 Template,這個檔案可在Repository Library中的T4子目中取得,記得要把.txt去掉.
若是自行撰寫的專案則開啟EFRepository.tt並修改SourceCsdlPath區段指定edmx或csdl檔案
譬如此展示專案改為
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF.Utility.CS.ttinclude"#><#@
output extension=".cs"#>
<#
UserSettings userSettings =
new UserSettings
{
SourceCsdlPath = "NorthwindModel.edmx",
ReferenceCsdlPaths = new string[] {},
FullyQualifySystemTypes = true,
CreateContextAddToMethods = true,
CamelCaseFields = false,
RepositoryNamesapce = "Repositories",
};
然後按Crel+s儲存這樣VS就會自動產生相關程式碼.
而在程式中使用非常容易.
有兩個部步驟
1.初始化
static void InitRepositoryBootstrapper()
{
RepositoryBootstrapper bootstrapper = new RepositoryBootstrapper();
NorthwindEntitiesRepositoryRegistry registry = new NorthwindEntitiesRepositoryRegistry(InstanceScope.ThreadLocal);
bootstrapper.AddRegistry(registry);
bootstrapper.Run();
}
其中的NorthwindEntitiesRepositoryRegistry為T4 Template產生的標準程式碼,而InstanceScope.ThreadLocal則為生命週期.
然後再透過AddRegistry註冊,並且執行Run運行就完成初始化動作.
詳細部分在後續文章繼續說明
2.使用
當初使化完成後,後續就可以透過Repository存取想要的資料,因T4 Template已經幫忙產生相關對應的Repository類別,且Repository Library本身也提供常用的函式使用.
譬如希望由Customers table取得資料則就能透過如下方式
using (ICustomersRepository repository = NorthwindEntitiesRepositoryFactory.GetRepository<ICustomersRepository>())
{
foreach (Customers cus in repository.GetAll())
{
Console.WriteLine(cus.Company_Name);
}
}
NorthwindEntitiesRepositoryFactory與ICustomersRepository都是T4 Template透過.edm分析而產生的對應類別,而GetAll()則為Repository Library提供的方法,這樣就能快速地取得資料.
以上初步簡單說明Repository Library使用方式,細節部分後續文章會開始介紹…