系列目錄
三. 集成輕量級ORM框架——SqlSugar
本來打算將搭建項目架構和集成SqlSugar放在一起講的,但是感覺東西有點多,還是分成兩章吧~
這一章講搭建項目的整體架構,這里先把搭建完成后的最終效果放出來,然后再逐個解釋每層的作用。

可以看到這里一共有七層,源碼在最下面,需要的可以下載源碼進行對照。
下面我按照自頂層向底層的順序介紹,所以和圖片列出的順序有點區別。
(一)RayPI 主項目層

我在控制器文件夾下添加了兩個文件夾,Admin和Client,分別用來存放后台和前台的接口。
這么做主要有兩個理由,一個是我覺得這樣可以把后台和前台的功能、權限分的清楚些;
第二個是,后面我們要試着讓我們的框架可以自動生成一些必備的代碼,以減少重復的工作量。這些代碼主要是增刪改查的基礎功能,我會將它們自動生成到admin里(畢竟對后台來說,每個實體都會涉及到增刪改查,這是跑不了的)。
控制器層除了偶爾會做一些參數是否為空的驗證外(有人認為驗證也不應該在控制器層做,因人而異),其他不做任何操作,只是將參數傳給下一層業務邏輯層處理。
所以除了接口的注釋信息、接口路徑、方法和權限等一些用於設置的代碼外,這一層就不應該有其他任何亂糟糟的代碼了~
(二)RayPI.Bussiness 業務邏輯層

我在業務邏輯層也就分成了Admin和Client兩塊,分別用來處理前后台的業務邏輯。該層只做業務邏輯的相關運算,不會對數據庫進行任何直接的操作。
業務邏輯層接收到控制器層傳遞的參數后,將這些參數做相應的處理,然后將加工后的參數傳給下一層:數據接口層。(按照比較簡單的三層架構思想,其實應該直接傳給數據層,但是這里利用數據接口層做了一個分隔,好處后面慢慢就會發現了)
(三)RayPI.IService 數據接口層

該層為數據接口層,里面只羅列了相應的接口函數,但是具體的函數功能實現則交給繼承該數據接口的數據層來實現。
這樣做的好處是可以將數據庫操作與代碼邏輯操作分離的更加清晰。
不論是編寫代碼還是閱讀代碼,我們在操作業務邏輯層時只需要知道我們調用的數據接口的功能即可,但是這個功能的具體實現則暫時不需要考慮;
當我們編寫或閱讀數據層時,只需要考慮是否實現了繼承的數據接口的功能,而不需要再往上去看業務邏輯層。
(四)RayPI.Service 數據層

該層負責直接或者間接對數據庫進行操作,如果你是用原生的或者類似Dapper的數據庫中間件,那么在這一層就會看到相應的sql語句(當然,這里我們選擇了集成SqlSugar作為數據庫操作中間件,下一章講)。
該層繼承了相應的數據接口,所以必須實現接口內的所有函數。
圖片上可以看到它還繼承了一個類,叫BaseDB,這個類是我自己添加的幫助類,在待會兒要講的Model層里,類里只有一個函數叫GetClient(),用來返回SqlSugarClient類(這個是SqlSugar集成的類,下一章具體講)。
(五)RayPI.Entity 實體層

該層為實體類層,存儲了數據庫對應的所有實體,實體一般和數據庫表是一一對應的。
(六)RayPI.Model 模型層

該層存放了一些系統幫助類,或是實體輔助類。
BaseDB用於返回SqlSugar的SqlSugarClient類,數據層一般直接繼承該類。
using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace RayPI.Model { public class BaseDB { public static SqlSugarClient GetClient() { SqlSugarClient db = new SqlSugarClient( new ConnectionConfig() { ConnectionString = BaseDBConfig.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true } ); db.Aop.OnLogExecuting = (sql, pars) => { Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); Console.WriteLine(); }; return db; } } }
BaseDBConfig用於存放數據庫的配置信息,比如數據庫連接字符串(這些配置信息還可以分離出來,存放到主項目的json文件中,以供讀寫,這個后面提出一章專門講)。
namespace RayPI.Model { public class BaseDBConfig { public static string ConnectionString = "server=.;uid=sa;pwd=Admin;database=RayPI"; } }
MessageModel是一個泛型的返回類,用於格式化的向接口返回數據。
using System; using System.Collections.Generic; using System.Text; namespace RayPI.Model { /// <summary> /// 通用返回信息類 /// </summary> public class MessageModel<T> { /// <summary> /// 操作是否成功 /// </summary> public bool Success { get; set; } /// <summary> /// 返回信息 /// </summary> public string Msg { get; set; } /// <summary> /// 返回數據集合 /// </summary> public List<T> Data { get; set; } } }
TableModel也是一個返回類,用於格式化的向接口返回列表格式的數據。
using System; using System.Collections.Generic; using System.Text; namespace RayPI.Model { /// <summary> /// 表格數據,支持分頁 /// </summary> public class TableModel<T> { /// <summary> /// 返回編碼 /// </summary> public int Code { get; set; } /// <summary> /// 返回信息 /// </summary> public string Msg { get; set; } /// <summary> /// 記錄總數 /// </summary> public int Count { get; set; } /// <summary> /// 返回數據集 /// </summary> public List<T> Data { get; set; } } }
(七)SqlSugar層

這一層並不是搭建出來的,而是從github引用的源碼。
SqlSugar是一個開源的ORM框架,可以實現度數據庫靈活方便的操作。如果你選擇不引用源碼,而是利用Nuget導包的方式向項目引入,那么項目里就沒有這一層。
關於引入並配置SqlSugar下一章再講~
具體可以參考下面的源碼
源碼下載地址:點擊獲取下載地址
到目前為止,項目架構相比第一章已經有點模樣了。
下一章我們就開始講繼承“輕量級”的ORM框架——SqlSugar,並且利用它實戰地編寫一個簡單完整的接口。
