這一層在園子里有很多很多的介紹了,這層寫好之后老胡也沒多研究,基本上就是參考的園子里大咖們的寫法,具體的說明老胡也細說不了了,把接口和思路簡單描述一下就好,如果有問題還是那句話,感謝您不吝賜教,老胡這廂有禮了。
其實如果您長期逛園子,在很多大咖們的博客里肯定都見過這類似的東西了,不錯,我把數據操作提出來了,並且使用了“Migrations”來實現數據庫的自動更新。
一年之前,我還是一個堅定的數據庫控,覺得軟件開發凡是都得首先去把數據庫設計好了。直到用了EF的Code First模式之后,才發現這才是軟件設計的終極,當然這只是一家之言,不過Code First的確對面向對象很有幫助,同時在設計Model層的時候,再也不同跳出到數據庫層面思考了,所有的外鍵、關聯、索引這些,都是自然而然地就出來了。順其自然,真的是很爽的一件事,不是么?
在這套架構中,我甚至把 AutomaticMigrationsEnabled = true; 都開啟了,在修改完代碼中的實體模型后,只要運行程序,數據庫結構都自動更新了,實際上,在用這個模式開發后,我就很少去關心數據表了。
最后,把IRepository列出來一下,應該就能說清楚本節的重點了,如有疑問,請參考園內大咖的專業文章,老胡就不一一贅述了。
1 public interface IRepository<T> : IRepositoryForUnitOfWork 2 { 3 /// <summary> 4 /// 新增數據(包含在事務中) 5 /// </summary> 6 /// <param name="entity">數據實體類</param> 7 /// <returns></returns> 8 void add(T entity); 9 /// <summary> 10 /// 更新數據(包含在事務中) 11 /// </summary> 12 /// <param name="entity">數據實體類</param> 13 void update(T entity); 14 /// <summary> 15 /// 刪除數據:邏輯刪除,通過刪除標記位實現(包含在事務中) 16 /// </summary> 17 /// <param name="entity">數據實體類</param> 18 void delete(T entity); 19 /// <summary> 20 /// 刪除數據:邏輯刪除,通過刪除標記位實現(包含在事務中) 21 /// </summary> 22 /// <param name="IdList">數據索引集合:逗號間隔多個索引</param> 23 void delete(Type ObjectClass, string IdList); 24 /// <summary> 25 /// 恢復數據:恢復被邏輯刪除的數據 26 /// </summary> 27 /// <param name="ObjectClass"></param> 28 /// <param name="IdList">數據索引集合:逗號間隔多個索引</param> 29 void recover(Type ObjectClass, string IdList); 30 /// <summary> 31 /// 執行SQL語句(包含在事務中) 32 /// </summary> 33 /// <param name="SQLCommand">SQL語句</param> 34 void executeSQL(string SQLCommand); 35 /// <summary> 36 /// 判斷指定條件的數據是否存在 37 /// </summary> 38 /// <param name="whereLambda">查詢條件</param> 39 /// <returns></returns> 40 bool exists(Expression<Func<T, bool>> whereLambda); 41 /// <summary> 42 /// 獲得指定的數據實體 43 /// </summary> 44 /// <param name="whereLambda">條件參數</param> 45 /// <returns></returns> 46 T read(Expression<Func<T, bool>> whereLambda); 47 /// <summary> 48 /// 獲得符合指定條件的數據條數 49 /// </summary> 50 /// <param name="whereLambda">條件參數</param> 51 /// <returns></returns> 52 int count(Expression<Func<T, bool>> whereLambda); 53 /// <summary> 54 /// 獲取符合條件的數據集合 55 /// </summary> 56 /// <param name="whereLamdba">條件參數</param> 57 /// <param name="orderName">排序列名</param> 58 /// <param name="isAsc">排序方式</param> 59 /// <returns></returns> 60 IQueryable<T> readList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc); 61 /// <summary> 62 /// 獲取符合條件的數據集合:實現多個排序定義 63 /// </summary> 64 /// <param name="whereLamdba">條件參數</param> 65 /// <param name="orderName">排序列名</param> 66 /// <param name="isAsc">排序方式</param> 67 /// <returns></returns> 68 IQueryable<T> readList(Expression<Func<T, bool>> whereLamdba, string[] orderName, bool[] isAsc); 69 /// <summary> 70 /// 獲取符合條件的數據帶分頁集合 71 /// </summary> 72 /// <param name="pageIndex">獲取頁碼</param> 73 /// <param name="pageSize">頁面尺寸</param> 74 /// <param name="totalRecord">返回:符合條件的數據條數</param> 75 /// <param name="pageCount">返回:符合條件的數據的頁面數量</param> 76 /// <param name="whereLamdba">條件參數</param> 77 /// <param name="orderName">排序列名</param> 78 /// <param name="isAsc">排序方式</param> 79 /// <returns></returns> 80 IQueryable<T> readPageList(int pageIndex, int pageSize, out int totalRecord, out int pageCount, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc); 81 /// <summary> 82 /// 獲取符合條件的數據帶分頁集合:實現多個排序定義 83 /// </summary> 84 /// <param name="pageIndex">獲取頁碼</param> 85 /// <param name="pageSize">頁面尺寸</param> 86 /// <param name="totalRecord">返回:符合條件的數據條數</param> 87 /// <param name="pageCount">返回:符合條件的數據的頁面數量</param> 88 /// <param name="whereLamdba">條件參數</param> 89 /// <param name="orderName">排序列名</param> 90 /// <param name="isAsc">排序方式</param> 91 /// <returns></returns> 92 IQueryable<T> readPageList(int pageIndex, int pageSize, out int totalRecord, out int pageCount, Expression<Func<T, bool>> whereLamdba, string[] orderName, bool[] isAsc); 93 }
值得一提的是,在這個接口定義中我制作了一個特殊的接口
void executeSQL(string SQLCommand);
用於執行直接的SQL語句,說來慚愧,老胡對LINQ TO EF, LINQ TO SQL這些東西理解還是過於淺顯,好多復雜的東西要不是實現不了,要不就是覺得實現起來太繁瑣,還不如直接來個SQL方便,所以就暴露出來這個接口(當然,老胡自我安慰的說法是:萬一哪天有個小弟要用這個框架,沒法通過LINQ TO EF來實現操作了,這不還有個后門么,嘿嘿。。。)
另外,這個架構下,我把所有的刪除都做成邏輯刪除了,之前的系統中好多都是做的物理刪除,最后數據(尤其是什么客戶資料啊、訂單信息啊)被刪后,無限痛苦啊。
OK,這層就這樣吧,真正體現老胡智慧的模型層和業務邏輯層就快出現了,老胡想靜靜,先。。。