[CAMCOCO][C#]我的系統架構.服務器端.(二)----DATA層


這一層在園子里有很多很多的介紹了,這層寫好之后老胡也沒多研究,基本上就是參考的園子里大咖們的寫法,具體的說明老胡也細說不了了,把接口和思路簡單描述一下就好,如果有問題還是那句話,感謝您不吝賜教,老胡這廂有禮了。

 

其實如果您長期逛園子,在很多大咖們的博客里肯定都見過這類似的東西了,不錯,我把數據操作提出來了,並且使用了“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,這層就這樣吧,真正體現老胡智慧的模型層和業務邏輯層就快出現了,老胡想靜靜,先。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM