1. 程式人生 > >從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】框架之六 || API專案整體搭建 6.1 倉儲模式

從壹開始前後端分離【 .NET Core2.0 +Vue2.0 】框架之六 || API專案整體搭建 6.1 倉儲模式

 程式碼已上傳Github+Gitee,文末有地址

  書接上文:前幾回文章中,我們花了三天的時間簡單瞭解了下介面文件Swagger框架,已經完全解放了我們的以前的Word說明文件,並且可以線上進行除錯,而且當專案開始之中,我們可以定義一些空的介面,或者可以返回假資料,這樣真正達到了前後端不等待的缺陷,還是很不錯的,當然,這離我說的前後端分離還是相差甚遠,今天呢,我們就簡單搭建下我們的專案架構。

  本專案是我自己的一個真實專案,資料都是真實的,之前搭建過一個MVC + EF Code First的專案,本專案就是基於這個了,前一段時間我已經搭建起來了,是這樣的,本系列教程會重新開始。

零、本期完成的思維腦圖中的粉色部分

一、建立.net Core 類庫,Model資料層

  其中,Models資料夾中,存放的是整個專案的資料庫表實體類,這裡是手動建立的,當然也可以自動建立,在以後的文章中我會提到,用到的是SqlSugar的T4建立,這裡先買一個伏筆。

  然後,VeiwModels資料夾,是存放的DTO實體類,在開發中,一般介面需要接受資料,返回資料,我之前都是這麼紅果果的使用的,後來發現弊端很大,不僅把重要資訊暴露出去(比如手機號等),還對資料造成冗餘(比如我需要接受使用者的生日,還需要具體的年、月、日這就是三個欄位,當然您也可以手動拆開,這只是一個栗子,所以不能直接用資料庫實體類接受),就用到了DTO類的轉換,但是頻繁的轉換又會麻煩,別慌,以後的文章中,我們會引用AutoMapper來自動轉換,這裡再買一個伏筆。

  最後的是MessageModel和TableModel,大家也基本一看就能明白,因為在前端介面中,需要固定的格式,以及操作,不能把資料直接發出去,會報錯,在以後的Vue開發中,會提到這個,這裡又買了一個伏筆。 如下:

 /// <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; } }

整個專案執行,沒錯,繼續建立下一層。

二、建立Blog.Core.IRepository和 Blog.Core.Repository 倉儲層

  這裡簡單說下倉儲層:repository就是一個管理資料持久層的,它負責資料的CRUD(Create, Read, Update, Delete) service layer是業務邏輯層,它常常需要訪問repository層。有網友這麼說:Repository(倉儲):協調領域和資料對映層,利用類似與集合的介面來訪問領域物件。Repository 是一個獨立的層,介於領域層與資料對映層(資料訪問層)之間。它的存在讓領域層感覺不到資料訪問層的存在,它提供一個類似集合的介面提供給領域層進行領域物件的訪問。Repository 是倉庫管理員,領域層需要什麼東西只需告訴倉庫管理員,由倉庫管理員把東西拿給它,並不需要知道東西實際放在哪。

   我們定義了IRepository層,提供了所有的操作介面,今天搭建框架,我簡單地寫一個例項,明天我們將把所有的方法巢狀進去。

  在 IAdvertisementRepository.cs 中,新增一個求和介面

   public interface IAdvertisementRepository
    {
        int Sum(int i, int j);
    }

  然後再在 AdvertisementRepository.cs 中去實現該介面,記得要新增引用,這個應該都會,就不細說了。  

    public class AdvertisementRepository : IAdvertisementRepository
    {
        public int Sum(int i, int j)
        {
            return i + j;
        }
    }

   執行專案,一起正常,繼續往下。

三、建立 Blog.Core.IServices 和 Blog.Core.Services 業務邏輯層,就是和我們平時使用的三層架構中的BLL層很相似

 

  Service層只負責將Repository倉儲層的資料進行呼叫,至於如何是與資料庫互動的,它不去管,這樣就可以達到一定程度上的解耦,加入以後資料庫要換,比如MySql,那Service層就完全不需要修改即可,至於真正意義的解耦,還是得靠依賴注入,這下一節我們會講到。

  這裡在 IAdvertisementServices 中新增介面

namespace Blog.Core.IServices
{
    public interface IAdvertisementServices 
    {
        int Sum(int i, int j);
    }
}

  然後再在 AdvertisementServices 中去實現該介面

 public class AdvertisementServices : IAdvertisementServices
    {
        IAdvertisementRepository dal = new AdvertisementRepository();

    public int Sum(int i, int j) { return dal.Sum(i, j); } }

  注意!這裡是引入了三個名稱空間

using Blog.Core.IRepository;
using Blog.Core.IServices;

using Blog.Core.Repository;

四、建立 Controller 介面呼叫

 

   將系統預設的ValueController刪除,手動新增一個BlogController控制器,可以選擇一個空的,也可以選擇一個帶有預設讀寫例項的。如下:

  [Produces("application/json")]
    [Route("api/Blog")]
    [Authorize(Policy ="Admin")]
    public class BlogController : Controller
    {
        // GET: api/Blog
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET: api/Blog/5
        [HttpGet("{id}", Name = "Get")]
        public string Get(int id)
        {
            return "value";
        }
        
        // POST: api/Blog
        [HttpPost]
        public void Post([FromBody]string value)
        {
        }
        
        // PUT: api/Blog/5
        [HttpPut("{id}")]
        public void Put(int id, [FromBody]string value)
        {
        }
        
        // DELETE: api/ApiWithActions/5
        [HttpDelete("{id}")]
        public void Delete(int id)
        {
        }
    }

  接下來,在應用層新增服務層的引用

using Blog.Core.IServices;
using Blog.Core.Services;

   然後,改寫Get方法

 ·······// GET: api/Blog
        /// <summary>
        /// Sum介面
        /// </summary>
        /// <param name="i">引數i</param>
        /// <param name="j">引數j</param>
        /// <returns></returns>
        [HttpGet]
        public int Get(int i,int j)
        {
            IAdvertisementServices advertisementServices = new AdvertisementServices();
            return advertisementServices.Sum(i,j);
        }

  F5 執行專案,除錯如下:

  天呀!出錯辣!別慌,還記得昨天咱們加的許可權麼,嗯!就是那裡,手動模擬登陸,獲取Token,注入,不會的可以看上一篇,然後再執行,結果:

  

 

五、結語

  好啦,今天的工作暫時到這裡了,你可以看到整體專案的搭建,結構,如何引用,如何測試等,當然,這裡還是有很多小問題,比如:

  ·如果每個倉儲都需要這麼寫,至少是四遍,會不會太麻煩;

  ·每次Controller介面呼叫,需要引入很多名稱空間

  ·等等等等

  這些問題,下一節我們都會帶大家一起去慢慢解決!

六、Code