系列目錄 一. 創建項目並集成swagger 1.1 創建 1.2 完善 二. 搭建項目整體架構 三. 集成輕量級ORM框架——SqlSugar 3.1 搭建環境 3.2 實戰篇:利用SqlSugar快速實現CRUD 3.3 生成實體類 四. 集成JWT授權驗證 五. 實現CORS跨域 六. 集成泛 ...
系列目錄
三. 集成輕量級ORM框架——SqlSugar
六. 集成泛型倉儲
源碼下載:https://github.com/WangRui321/RayPI_V2.0
註:以下項目里的Service層其實是DAL層的意思,以前都習慣寫DAL的,經園友回覆提醒,Service一般指業務邏輯層,用Service確實不准確,下個版本更新會更正一下~
1. 根
之前在集成SqlSugar的時候,我們用Student類作為例子,寫了5個基礎的介面:獲取集合、獲取單個、添加、修改、刪除,也就是常說的倉儲的CRUD了。
Service層的代碼是這樣的:
而且我們規定,以後每個實體類都必須有這個5個基礎介面。
所以,當我們再添加一個實體(比如Teacher)時,在TeacherService中也要寫和StudentService幾乎一樣的代碼(其實就是把代碼里所有“Student”換成“Teacher”就行了)。
這麼多重覆代碼,顯然是不符合程式員的審美的。這個時候使用泛型倉儲就再適合不過了。
2. 道
整體思路是,寫一個基類“BaseService”,這個基類是一個抽象的泛型類,然後讓每個實體的Service都繼承它。
那麼當再新建一個Service時,不需要寫任何代碼,就已經實現了我們需要的那5種基礎CRUD了。
2.1 IService層
在IService層新建一個IBase介面:
using RayPI.Model; namespace RayPI.IService { public interface IBase<T> where T:class,new() { /// <summary> /// 獲取分頁列表 /// </summary> /// <param name="pageIndex"></param> /// <param name="pageSize"></param> /// <returns></returns> TableModel<T> GetPageList(int pageIndex, int pageSize); /// <summary> /// 獲取單個 /// </summary> /// <param name="id"></param> /// <returns></returns> T Get(long id); /// <summary> /// 添加 /// </summary> /// <param name="entity"></param> /// <returns></returns> bool Add(T entity); /// <summary> /// 編輯 /// </summary> /// <param name="entity"></param> /// <returns></returns> bool Update(T entity); /// <summary> /// 批量刪除 /// </summary> /// <param name="ids"></param> /// <returns></returns> bool Dels(dynamic[] ids); } }IBase
該介面是個泛型介面,裡面集成了對泛型T的5中基礎CRUD操作。
2.2 Service層
在Service層新建一個BaseService類:
using RayPI.Model; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace RayPI.Service { /// <summary> /// 服務層基類 /// </summary> /// <typeparam name="T"></typeparam> public abstract class BaseService<T> where T:class,new() { public BaseService() { db = GetClient(); sdb = db.GetSimpleClient(); } public SqlSugarClient db; public SimpleClient sdb; /// <summary> /// 獲取客戶端 /// </summary> /// <returns></returns> private 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; } #region CRUD public TableModel<T> GetPageList(int pageIndex, int pageSize) { PageModel p = new PageModel() { PageIndex = pageIndex, PageSize = pageSize }; Expression<Func<T, bool>> ex = (it => 1 == 1); List<T> data = sdb.GetPageList(ex, p); var t = new TableModel<T> { Code = 0, Count = p.PageCount, Data = data, Msg = "成功" }; return t; } public T Get(long id) { return sdb.GetById<T>(id); } public bool Add(T entity) { return sdb.Insert(entity); } public bool Update(T entity) { return sdb.Update(entity); } public bool Dels(dynamic[] ids) { return sdb.DeleteByIds<T>(ids); } #endregion } }BaseService
該類為abstract抽象類,只能用來被其他類繼承,不能實例化。
然後該類除了之前的獲取SqlSugarClient的函數,還了5個集成基礎CRUD操作,不一樣的是這裡不是傳的實體類,而是一個泛型T。
3. 果
下麵,我們寫一個Teacher的完整的增刪改查。
先在資料庫新建一張教師表:
然後運行項目,調用我們之前寫好的自動生成實體類的介面:
生成的實體類是這樣的:
在IService層新建一個ITeacher介面:
跟之前不一樣的是,這個介面里不需要再寫增刪改查的介面了,直接繼承IBase,把Teacher傳過去,就行了。
在Service層,新建一個TeacherService:
該Service也不要寫增刪改查,直接繼承BaseService就有了。
然後Bussiness層和控制器層這裡就不說了,跟之前一樣:
運行調試:
這樣,不用寫任何底層倉儲,就能實現基礎的增刪改查了,是不是很爽~