系列目錄html
1.1 建立程序員
1.2 完善github
二. 搭建項目總體架構sql
三. 集成輕量級ORM框架——SqlSugar數據庫
3.1 搭建環境跨域
四. 集成JWT受權驗證ide
六. 集成泛型倉儲
源碼下載:https://github.com/WangRui321/RayPI_V2.0
注:如下項目裏的Service層實際上是DAL層的意思,之前都習慣寫DAL的,經園友回覆提醒,Service通常指業務邏輯層,用Service確實不許確,下個版本更新會更正一下~
以前在集成SqlSugar的時候,咱們用Student類做爲例子,寫了5個基礎的接口:獲取集合、獲取單個、添加、修改、刪除,也就是常說的倉儲的CRUD了。
Service層的代碼是這樣的:
並且咱們規定,之後每一個實體類都必須有這個5個基礎接口。
因此,當咱們再添加一個實體(好比Teacher)時,在TeacherService中也要寫和StudentService幾乎同樣的代碼(其實就是把代碼裏全部「Student」換成「Teacher」就好了)。
這麼多重複代碼,顯然是不符合程序員的審美的。這個時候使用泛型倉儲就再適合不過了。
總體思路是,寫一個基類「BaseService」,這個基類是一個抽象的泛型類,而後讓每一個實體的Service都繼承它。
那麼當再新建一個Service時,不須要寫任何代碼,就已經實現了咱們須要的那5種基礎CRUD了。
在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); } }
該接口是個泛型接口,裏面集成了對泛型T的5中基礎CRUD操做。
在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 } }
該類爲abstract抽象類,只能用來被其餘類繼承,不能實例化。
而後該類除了以前的獲取SqlSugarClient的函數,還了5個集成基礎CRUD操做,不同的是這裏不是傳的實體類,而是一個泛型T。
下面,咱們寫一個Teacher的完整的增刪改查。
先在數據庫新建一張教師表:
而後運行項目,調用咱們以前寫好的自動生成實體類的接口:
生成的實體類是這樣的:
在IService層新建一個ITeacher接口:
跟以前不同的是,這個接口裏不須要再寫增刪改查的接口了,直接繼承IBase,把Teacher傳過去,就好了。
在Service層,新建一個TeacherService:
該Service也不要寫增刪改查,直接繼承BaseService就有了。
而後Bussiness層和控制器層這裏就不說了,跟以前同樣:
運行調試:
這樣,不用寫任何底層倉儲,就能實現基礎的增刪改查了,是否是很爽~