【從零開始搭建自己的.NET Core Api框架】(六)泛型倉儲的作用


系列目錄

.  創建項目並集成swagger

  1.1 創建

  1.2 完善

二. 搭建項目整體架構

三. 集成輕量級ORM框架——SqlSugar

  3.1 搭建環境

  3.2 實戰篇:利用SqlSugar快速實現CRUD

  3.3 生成實體類

四. 集成JWT授權驗證

五. 實現CORS跨域

六. 集成泛型倉儲

 


 源碼下載: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層和控制器層這里就不說了,跟之前一樣:

 

運行調試:

 這樣,不用寫任何底層倉儲,就能實現基礎的增刪改查了,是不是很爽~

 


免責聲明!

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



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