前言
- 這一篇是本系列的最后一篇,雖然示例講到這里就停止呢,但對於這些技術的學習遠不能停止。雖然本示例講的比較基礎,但是正如我第一篇說到的,這個系列的目的不是說一些高端的架構設計,而是作為一個入門級,對學習EntityFramework6構建一個簡單的示例以及對其進行設計,管理,編碼的過程。
- 應部分園友要求,博客換了一個清爽的模板。之前的模板也是為了學習一下,所以按照其他模板的樣式,把自己的博客園模板修該了一下。雖然這不是寫博客的主要目的,但還是從中學習到了很多,比如小插件的應用、運行js和css控制樣式等。所以“動手”才是我們GET新技能最有效的方式。
- 解決方案示例只剩下服務層沒有說明了,在這篇中會對其進行說明。接下來就是介紹一些相應的學習資源,幫助自己和大家共同進步。
Factory工廠的構建
- 現在在設計軟件的時候,我們很少利用new關鍵字來創建對象,原因就是現在的系統的層次結構原來越復雜。為了有效的減少層級間的耦合度,我們會使用一些其他的設計方法。比如之前說的依賴注入,這樣的IOC容器有很多。不過服務層我還是利用設計模式中的工廠模式來減少層級間的垂直依賴關系。
- 首先我們先建立一個緩存類, 因為對象的創建需要消耗資源和時間。利用緩存就可以對同一對象不需要反復創建,而是直接去加載緩存,這樣可以提升系統的效率。參考代碼如下:
public class DataCache { // 獲取當前應用程序指定CacheKey的Cache值 public static object GetCache(string CacheKey) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; return objCache[CacheKey]; } // 設置當前應用程序指定CacheKey的Cache值 public static void SetCache(string CacheKey, object objObject) { System.Web.Caching.Cache objCache = HttpRuntime.Cache; objCache.Insert(CacheKey, objObject); } }
- 接下來,我們利用Reflection來對Concrete的對象進行動態創建。這樣我們可以在需要的時候才對對象進行創建,有效的提升了系統的性能。參考代碼如下:
//不使用緩存 private static object CreateObjectNoCache(string AssemblyPath, string classNamespace) { try { object objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace); return objType; } catch//(System.Exception ex) { //string str=ex.Message;// 記錄錯誤日志 return null; } } //使用緩存 private static object CreateObject(string AssemblyPath, string classNamespace) { object objType = DataCache.GetCache(classNamespace); if (objType == null) { try { objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace); DataCache.SetCache(classNamespace, objType);// 寫入緩存 } catch//(System.Exception ex) { //string str=ex.Message;// 記錄錯誤日志 } } return objType; }
- 最后,我們創建數據層接口對象就變得非常簡單呢,只需要提供程序集路徑和命名空間的名稱,例如用戶接口對象的創建參考代碼如下:
// 創建S_UserRepository數據層接口。 public static IS_UserRepository CreateS_User() { string ClassNamespace = AssemblyPath + ".S_UserRepository"; object objType = CreateObject(AssemblyPath, ClassNamespace); return (IS_UserRepository)objType; }
- 在Service層新建web服務文件SysUserService.asmx后,我們就可以在其中對用戶接口層中的方法進行調用呢,例如讀取用戶列表的第一個用戶的名稱。參考代碼如下:
private readonly IS_UserRepository bllS_User = DataAccess.CreateS_User(); [WebMethod] public string HelloWorld() { int total; string strName = bllS_User.GetInfo("", 10, 1, out total).FirstOrDefault().UserName; return "Hello World: " + strName; }
- 到此,服務層的創建工作已經完成。雖然沒有對代碼進行編寫了,不過可以按照上面的模式對服務層構建完整的解決方案。源碼已經放入網盤,點擊下載。
備注
- 如果你對EntityFramework還沒有了解,可以觀看微軟專家的幾個視頻資源進行了解。
- 如果了解了EntityFramework可以直接查看以下博客,這是Entity Framework 6 Code First系列博客,新的系列采用Entity Framework 6和MVC5構建,寫得非常好。主要包括一下內容:
- 創建Entity Framework 數據模型
- 實現基本的CRUD功能
- 排序、過濾和分頁
- 連接彈性和命令攔截
- Code First 代碼遷移和部署
- 創建復雜數據模型
- 讀取關聯數據
- 更新關聯數據
- 異步和存儲過程
- 並發處理
……..
博客鏈接地址:點此跳轉
- 如果你已經對EntityFramework非常了解了,並且需要對其構建企業級應用架構和解決方案,可以查看以下的開源架構。CodePlex上的開源框架EFMVC,主要包含以下類容:
Technologies
- Windows Azure SDK
- ASP.NET MVC 4 RTM
- ASP.NET Web API
- Entity Framework Code First 5
- Autofac
- AutoMapper
- NUnit
- Moq
Patterns & Practices
- Domain Driven Design (DDD)
- Test-Driven Development (TDD)
- Repository Pattern & Generic Repository
- Unit of Work Pattern
- Dependency Injection
點此查看鏈接地址