###### tags: `Web` `DotNet Core` `Pattern` `Pattern` # MediatR介紹與CQRS簡介 ## 簡述 基本上MediatR就是Service層的中介者,大部分狀況會搭配CQRS讀寫分離模式使用。我們看到下圖是一個簡易流程,為了簡化說明,可以直接視為. Net Core就是後端Controller開始的地方,到Service(Logic)端部分對於DB操作在CQRS模式下會特別將讀(Query logic)寫(Command logic)猜成兩部分。  在一般狀況下,只作CQRS模式不使用MediatR,就要自行託管Service(Query logic,Command logic)。若使用MediatR,Service託管可以完全交託給他,他就像一個仲介者,可轉安排Controller調用不同的Service,這樣Controller就不用針對不同使用Service注入。因此MediatR在多人大型專案設計上,在使用Service部分可以達到完全解偶,每個人同步開發不同Servcie比較不會有衝突問題。 比較一下有使用MediatR與未使用的Controller建構子的比較 - 使用MediatR:建構子只需注入MediatR,將Service交付託管 - 未使用MediatR:建構子需注入相對應Service  接著看一下實際的API撰寫。若使用MediatR,當設置好後除了建構子注入不因Service的變動需異動外,在實際使用Service看起來也較簡潔。  MediatR其實大致公用就如同中介者模式,中介者模式主要是指定義一箇中介對象來調度一系列對象之間的交互關係,各對象之間不需要顯式的相互引用,進而降低耦合性。通過 MediatR 多播消息傳遞可以使代碼實現邏輯上更加簡潔,另外也有較多應用實現在 CQRS、EventBus 等  ## 關於CQRS Pattern 在Survery MediatR時,蠻多都會與CQRS一起使用,這邊稍微解述一下什麼是CQRS。 在後端為了乘載高流量狀況下,會將資料庫讀寫分成兩個DB,在高流量系統可穩定作資料庫讀寫,通常會拆成兩個API Service(獨立運行),一個負責寫,一個負責讀。 這時底層就會將傳統的Service,Repository整合成讀寫兩個部分。因此若系統走服務設計基本上就會看到這樣的設置,在服務分類啟用與測試都會較為方便。 但若是單體式服務,基本上較常看到一般後端傳統分層寫法如下,會分成Conteroole,Service,Repository,DataAccess - Controller : 給Client端的API第一時間接口,提供Get,Post,Delete,Update API。除了此在此層一般都會安插屬性驗證Client第一時間傳過來的資料是否正確。並作實際的DTO(Object 與DB Model Mapping)轉換。 - Service : 這層基本上就是作商業邏輯的處哩,進到此層的資料基本上都是做完DTO轉換,在此層通常會作實際的資料邏輯處理處理完後再往DB方向送。 - Repository : DataSource上一層,一般會除了實際面DataSource讀寫變更操作外,Source 資料Join處理也會在此層處理。一般多這一層都是為了隔開DataSource的來源切換,不管置換不同的DB系統,或是Source改成Shared Prefs,都可快速置換資料來源。 - DataAccess : 一般狀況下就DB Context。  若沒套用CQRS你大概會看到Service與Repository裡面充斥著各種讀寫命名Method,如下圖   若套用CQRS針對讀寫(Query與Command)以事件命名導向去設計Serice,基本上一個Serice就是一個服務事件,且讀寫事件會特別拆開設計。操作面上有幾個優點 - 可針對多體服務設計 - 在服務測試上較方便 - 多人開發上維護方便 目前除了API如果真的太多,設計上會較麻煩外,其餘的應該沒什麼特別缺點,搭配MediatR使用則可以讓解偶達到更極致。  ## 參考 [ASP.NETCore消息傳遞:MediatR](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/749453/) [應用程式的分層設計 (4) - CQRS 風味](https://www.huanlintalk.com/2015/07/designing-layered-application-4-cqrs.html) [Asp.Net Core 簡易的使用MediatR](https://dotblogs.com.tw/Null/2019/12/06/100358) [Intro to MediatR - Implementing CQRS and Mediator Patterns](https://www.youtube.com/watch?v=yozD5Tnd8nw) [SOLID Architecture in Slices not Layers - Jimmy Bogard]( )
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up