【從零開始搭建本身的.NET Core Api框架】(六)泛型倉儲的做用

系列目錄html

.  建立項目並集成swagger
git

  1.1 建立程序員

  1.2 完善github

二. 搭建項目總體架構sql

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

  3.1 搭建環境跨域

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

  3.3 生成實體類框架

四. 集成JWT受權驗證ide

五. 實現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層和控制器層這裏就不說了,跟以前同樣:

 

運行調試:

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

相關文章
相關標籤/搜索