入門實戰-在專案中加個應用層,為多層結構建立基礎
以上11篇的演練已經簡單講清楚了asp.net core開發的一個(表)選單管理的小功能,感興趣的可以自行演練其他功能,演練熟悉即可,我將這些內容整理成文章時,專門新建了個專案代碼,又重新弄了一遍,對每個關鍵點做截圖和做解釋說明,
本章在將下一部分功能是,想做個簡單總結和擴展,我們面對的專案總是逐步復雜的,網上和很多教程書上都對一個專案做很多分層,比如Model層,業務層,服務層等等,我想簡單做個分層,就是把服務層拿出來,先單獨放個檔案夾里面,我們以檔案夾為分層標識,來進行一個簡單的劃分,
如下圖示

除了原有的M,V,C三個層后,我又增加了:
Common:存放一些核心處理的公共類別庫,比如密碼處理,字串處理等
Db:存放資料操作的一些類和檔案
Service:存放業務處理的服務類檔案
UpFiles:上傳檔案存放
當然,還可以在擴展,我們先從檔案上區分,以后講到負責業務邏輯、WebApi等復雜功能時,我們學著拆分、并規劃成合理的分層結構,
分層是大型專案必備的,架構師對整個專案要分層,考慮的可能是專案需要:多人協作、模塊分包、專案需要多端(移動或者物聯網等)訪問與移植、面向物件考慮、易于維護、測驗等等多方面因素,如何分層,其實取決于架構師對專案的理解和需要,我們要學的是,先分層,甭管是什么原因,初學時也遇不到讓你去分層,記住分層的結果,然后再逆推,以達到在作業中理解和使用的目的,所以無論如何分層,其本質是為了所謂降低模塊或者代碼檔案直接的關聯(耦合)性,實作相對獨立,
基于此,我就建了Service檔案夾,里面的每個類對應2個檔案:一個介面,一個實作;
(1).還以Menu這個選單管理的功能為例,我在Service檔案夾中創建IMenuService.cs介面類和MenuService.cs服務類;

(2).介面類的代碼比較簡單,服務類繼承介面,然后實作介面類即可;注意,服務類在實作時,呼叫EF操作類,通過建構式的方式注入使用,詳細可見服務類代碼;



public class MenuService : IMenuService { private readonly AppDbContext _appDbContext; public MenuService(AppDbContext appDbContext) { _appDbContext = appDbContext; } public bool AddMenu(Menu menu) { menu.IsDelete = false; menu.AddManagerId = 1;//用戶id,可讀取Cookie、Session或Claims內用戶Id menu.AddTime = DateTime.Now; menu.IsSystem = true; _appDbContext.Menu.Add(menu); var result = _appDbContext.SaveChanges(); return result == 1;//注意(result==1 如果等式成立,則回傳true,說明洗掉成功) } public bool DeleteMenu(int Id) { var delMenu = _appDbContext.Menu.FirstOrDefault(x => x.Id == Id); if (delMenu != null) { _appDbContext.Menu.Remove(delMenu); } var result = _appDbContext.SaveChanges(); return result == 1; //注意(result==1 如果等式成立,則回傳true,說明洗掉成功) } public Menu FindMenu(int Id) { var item = _appDbContext.Menu.Where(x => x.Id == Id).FirstOrDefault(); return item; } public bool UpdateMenu(int id, Menu menu) { var oldMenu = FindMenu(id); //找出舊物件 //將新值賦到舊物件上 oldMenu.Name = menu.Name; oldMenu.ParentId = menu.ParentId; oldMenu.DisplayName = menu.DisplayName; oldMenu.Sort = menu.Sort; oldMenu.LinkUrl = menu.LinkUrl; oldMenu.ModifyManagerId = 11;// oldMenu.ModifyTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); //對舊物件執行更新 _appDbContext.Entry(oldMenu).State = EntityState.Modified; var result = _appDbContext.SaveChanges(); return result == 1;//注意(result==1 如果等式成立,則回傳true,說明洗掉成功) } }
(3).在Controller中呼叫服務類,實作對應功能,我以MenuController.cs中的Add和Edit為例,貼出對應代碼,看起來整體代碼的結構和邏輯就整潔和美觀許多,也容易理解,



(4).關于分頁程式在服務類的撰寫實體,現在還是在Controller中直接通過Linq語法實作,回頭我放在后面再講,其他程式依次類推,不在贅述,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/535103.html
標籤:.NET Core
