Design

Design
asp.net mvc

2019年5月6日 星期一

ASP.NET MVC 三層架構Three tier 實作

滿久之前有跟大家提三到層架構,回顧可以先點這裡,卻一直少了實作的部分,這範例專案其實三年前就做好了只是一直放著沒時間補上,這架構其實也算很古老了,今天就把這部分補上.

這邊的範例就是簡單的identity登入功能 透過三層架構的方式
順序從前端輸入登入  打Controller層自己建的登入WabApi方法 再到Service層驗證登入的邏輯  最後在Repository層跟DB溝通 完整降低耦合 邏輯切割 邏輯也只須關注Service層 不管在系統開發業務切割都有很大的好處.首先我們先看下面這張專案圖
當然以上不是一定的,純粹給大家一個基本三層的建構概念體驗當中的魅力
首先我們要進行分層我們需要熟悉一種技術Dependency injection(DI 依賴注入) 
Interface(https://aspnetmars.blogspot.com/2017/05/interface-c.html)透過介面的方式實作,這也都算滿老的基礎技術網路上也滿多文章的,這有時間再整理一篇,我們繼續.


首先我們需要使用先nuget我們的di套件這邊使用Unity(https://aspnetmars.blogspot.com/2017/05/unity-di.html),也不一定要用unity也有其他種大同小異
有兩種MVC跟WebAPI的版本 我這邊是兩個都載 差別就是一個是Controller用跟WebAPI用.其實也只要用WebApi,MVC版是看你們有沒要在Controller的地方注入


然後官方也有提醒記得在Global.asax加入以下這段
然後可以發現我們App_Start多了兩個檔案UnityConfig.cs跟UnityMvcActivator.cs 
我們重點放在UnityConfig.cs注入的相關參數都會在這執行,UnityMvcActivator基本上不太會動到主要功用就是程序剛執行要跑的部分


相關可以發現我依照名稱尾端名稱分別注入了Service跟Repository其實簡略點可以只注入Service
然後FormAllInterfaces自動就去找Interface完成我們的注入
然後可以發現我們多了個getInjectionMembers底下實作了LoggingInterceptionBehavior
主要功用為去攔截我們每個注入的方法,這好處是什麼.你應該也猜到了.就是可以記錄我們的log這邊我是使用了Nlog(https://aspnetmars.blogspot.com/2017/05/nlog-bug.html+ Slack再來就跟各位演示整個流程

還沒忘記我們一開始的功能吧 開始登入網站 看看這架構的魅力吧

1.首先登入這沒問題



















2.再來就是打API來到我們Controller層 可以發現我們這邊又去呼叫Service層
































3.來到Service層,這邊又去呼叫我們Repository層要資料 這邊就是可以寫我們商業邏輯的地方,可以發現我們吧一些驗證邏輯寫在這如果我們邏輯需要異動只要改這個部分也不會影響到Controller 做到業務分層,在共同開發下也更為清楚,好處可以說是非常多,特別是在東西越來越多的狀況下越能體會到這架構的好處






























4.來到Repository層 這邊就是可以去我們資料庫要資料了 像我們每一層都需要定義Model分層的話又可以讓每個階層的東西放在各自位置這也是好處之一.























5.最後在Repository > Service > Controller  當然就是登入成功啦


然後剛剛有跟各位提到LoggingInterceptionBehavior
我這邊自己寫的 基本上是長這樣  紀錄 呼叫 , 回傳 或 Exception 這邊紀錄是使用Nlog我也有寫過一篇大家可以去看看,然後我範例記錄位置我是記錄在Slack 因為那時候Slack很潮XD 

Slack就會長這樣 完整記錄有注入過的方法的資訊 紀錄格式就不一定看各位想紀錄什麼

錯誤的話就會像這樣 我在哪一層哪個方法錯誤


以上就大概是簡單的範例  
架構上要說簡單也簡單 要說繁雜就是繁雜  後續還要考慮單元測試 自動部屬 等等等  還有很多可以在說明跟優化,有任何問題可以在底下留言.

3 則留言:

  1. 感謝分享,想請問畫面右下角會根據滑鼠tracking的動畫是怎麼實現的嗎?謝謝。

    回覆刪除
  2. 作者已經移除這則留言。

    回覆刪除