Entity Framework Generic Repository Library

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

2.http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/

 

雖然文章與範例很多但在實際應用上都僅能做為參考的設計方式,無法直接拿來使用.
故撰寫了一個通用型的應用於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

開啟專案結構如下

image

 

其中參考引用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使用方式,細節部分後續文章會開始介紹…