日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core中使用MediatR实现命令和中介者模式

發(fā)布時間:2023/12/4 asp.net 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core中使用MediatR实现命令和中介者模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:依樂祝
原文地址:https://www.cnblogs.com/yilezhu/p/9866068.html

在本文中,我將解釋命令模式,以及如何利用基于命令模式的第三方庫來實(shí)現(xiàn)它們,以及如何在ASP.NET Core中使用它來解決我們的問題并使代碼簡潔。因此,我們將通過下面的主題來進(jìn)行相關(guān)的講解。

  • 什么是命令模式?

  • 命令模式的簡單實(shí)例以及中介者模式的簡單描述

  • MVC中的瘦控制器是什么?我們是如何實(shí)現(xiàn)使控制器變瘦的?

  • 我們?nèi)绾卧谖覀兊?NET Core應(yīng)用程序中使用MediatR

  • 使用命令和事件的實(shí)例

命令模式及其簡單實(shí)例

從根本上講,命令模式是一種數(shù)據(jù)驅(qū)動的設(shè)計模式,屬于行為模式的范疇。命令是我們可以執(zhí)行的某種操作或行為,它可以是活動的一部分。一個活動可以有一個或多個命令和實(shí)現(xiàn)。

我們可以這樣來說,請求以命令的形式包裹在對象中,并傳給調(diào)用對象。調(diào)用者(代理)對象查找可以處理該命令的合適的對象,并把該命令傳給相應(yīng)的對象,該對象執(zhí)行命令 。

一個簡單的例子是多種類型的消息。Message類包含SendEmail()和SendSms()等屬性和方法。使用兩種類型的命令,并且需要一個接口,它應(yīng)該由實(shí)現(xiàn)了EmailMessageCommand和SMSMessageCommand的類類繼承。還使用代理類來調(diào)用特定類型的消息類來處理操作。

Main class

消息類

接口和代理類

命令

輸出

什么是瘦控制器,我們?yōu)槭裁葱枰?#xff1f;什么是MediatR?

當(dāng)我們開始使用MVC框架進(jìn)行開發(fā)時,邏輯是用控制器的動作方法編寫的;就像我們有一個簡單的電子商務(wù)應(yīng)用程序,其中用戶應(yīng)該會下訂單。我們有一個控制器,OrderController,用來管理訂單。當(dāng)用戶下訂單時,我們應(yīng)該在數(shù)據(jù)庫中保存記錄。
在此之前,我們有一個簡化的代碼。然而,經(jīng)過一段時間后,我們意識到還有一個確認(rèn)電子郵件的業(yè)務(wù)需求。現(xiàn)在,第二步是發(fā)送確認(rèn)電子郵件給客戶。后來,我們意識到,在這個步驟之后,我們還需要執(zhí)行另一個操作,即,記錄信息等。最后,我們還需要將用戶的信息保存到CRM中。關(guān)鍵是它會增長控制器的大小。現(xiàn)在,我們可以稱之為“臃腫控制器”。
基于命令的體系結(jié)構(gòu)允許我們發(fā)送命令來執(zhí)行某些操作,并且我們有單獨(dú)的命令處理程序,使關(guān)注點(diǎn)分離和提高單一職責(zé)。為了實(shí)現(xiàn)這個架構(gòu),我們可以使用第三方庫,比如MediatR(Mediator.),它為我們做了很多基礎(chǔ)工作。中介模式定義了一個對象,該對象封裝了一組對象是如何交互的。

中介模式的優(yōu)勢及MediatR如何幫助我們實(shí)現(xiàn)中介模式

  • 中介模式定義了一個對象,該對象封裝了一組對象是如何交互的(如維基百科定義的)。

  • 它通過保持對象彼此明確地相互引用來促進(jìn)松散耦合。

  • 它通過允許通信被卸載到一個只處理這類的類來促進(jìn)單一責(zé)任原則。

MediatR庫如何幫助我們

MediatR允許我們通過讓控制器Action向處理程序發(fā)送請求消息來將控制器與業(yè)務(wù)邏輯解耦。MediatR庫支持兩種類型的操作。

  • 命令(預(yù)期輸出結(jié)果)

  • 事件(請求者不關(guān)心接下來發(fā)生了什么,不期待結(jié)果)

我們已經(jīng)介紹了命令模式,因此是時候定義一些命令并使用MediatR發(fā)出命令了。

在ASP.NET Core中安裝

我們需要從NuGet安裝MediatR和MediatR.Extensions.Microsoft.DependencyInjection包。

當(dāng)這兩個軟件包安裝完畢后,我們需要添加services.AddMediatR();?到startup.cs文件。看起來像這樣。

現(xiàn)在,我們可以使用.NET Core 項目中的MediatR了。

實(shí)例

第一個示例演示了使用MediatR使用請求/響應(yīng)類型的操作。它期望對請求做出一些反應(yīng)。
第二個示例將向您展示一個事件,其中多個處理程序執(zhí)行它們的工作,調(diào)用者并不關(guān)心接下來會發(fā)生什么,也不期望任何結(jié)果/響應(yīng)。

第一個例子

在這種場景下,我們希望注冊用戶并期望對請求做出一些響應(yīng)。如果響應(yīng)返回true,我們可以像登錄用戶一樣進(jìn)行進(jìn)一步的操作。
首先,我們需要創(chuàng)建一個繼承自IRequest的類。

IRequest是指請求的響應(yīng)是布爾響應(yīng)。
現(xiàn)在,需要一個處理程序來處理這種類型的請求。

現(xiàn)在我們有了命令和它的處理程序,我們可以調(diào)用MediatR在我們的控制器中做一些操作。

這些是Home控制器的動作方法。

第一個例子的結(jié)論

注冊操作方法使用了[HttpPost]屬性進(jìn)行修飾,并接受新的用戶注冊請求。然后,它請求MediatR 進(jìn)行處理。它期望來自請求的結(jié)果/響應(yīng),如果結(jié)果是真的,則將用戶重定向到登錄頁面。
這里,我們有簡潔的代碼,大部分的工作是在控制器外部完成的。這實(shí)現(xiàn)了對不同操作的處理的關(guān)注點(diǎn)分離(SoC)和單一責(zé)任的分離。
在第二個示例中,我們將演示使用多個處理程序?qū)γ顖?zhí)行不同操作的場景。

第二個實(shí)例

在這種情況下,我們使NewUser 繼承了INotification

現(xiàn)在,有三個處理程序逐個執(zhí)行,以完成他們的工作。這些都是從INotificationHandler繼承下來的。

第二個處理程序在下面的代碼中定義。

這是第三個處理程序的代碼

然后,我們控制器中的代碼像下面這樣

第二個例子的結(jié)論

此應(yīng)用程序的輸出如下:
當(dāng)用戶注冊后,三個處理程序逐個執(zhí)行——分別是NewUserHandler、EmailHandler和LogHandler,并執(zhí)行它們的操作。

這里,我們使用了Publish 方法,而不是Send 函數(shù)。發(fā)布將調(diào)用訂閱了NewUser 類的所有處理程序。這只是一個示例,我們可以根據(jù)命令進(jìn)行思考,然后按照我們在命令模式中討論的方式相應(yīng)地執(zhí)行一些操作。

Mediatr是如何提供幫助的?

它可以用來隱藏實(shí)現(xiàn)的細(xì)節(jié),用來使控制器代碼更加干凈和可維護(hù),可以重用多個處理程序,并且每個處理程序都有自己的責(zé)任,因此易于管理和維護(hù)。

在我的下一篇文章中,我將嘗試解釋CQRS架構(gòu)模式及其優(yōu)點(diǎn)以及如何使用MediatR來實(shí)現(xiàn)CQRS。

原文地址:https://www.c-sharpcorner.com/article/command-mediator-pattern-in-asp-net-core-using-mediatr2/

總結(jié)

以上是生活随笔為你收集整理的ASP.NET Core中使用MediatR实现命令和中介者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。