<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何在 ASP.Net Core 中使用 MediatR

          共 6640字,需瀏覽 14分鐘

           ·

          2021-03-12 10:55


          MediatR 是一個(gè) 中介者模式 的.NET開源實(shí)現(xiàn), 中介者模式 管控了一組對象之間的相互通訊并有效的減少了對象之間錯(cuò)綜復(fù)雜的相互依賴,在 中介者模式 中,一個(gè)對象不需要直接和另一個(gè)對象進(jìn)行通訊,而是通過 中介者 進(jìn)行轉(zhuǎn)達(dá),這篇文章將會(huì)討論如何在 ASP.Net Core 中使用 MediatR 。

          安裝 MediatR

          在 ASP.Net Core 中使用 MediatR 非常簡單,你只需要通過 Nuget 安裝如下兩個(gè)包即可。

          • MediatR

          • MediatR.Extensions.Microsoft.DependencyInjection

          當(dāng)前最新的版本為 9.0.0,如下圖所示:

          配置 MediatR

          一旦上面的兩個(gè) Nuget 包安裝到項(xiàng)目之后,接下來就可以在 Startup 類中進(jìn)行 MediatR 的配置了,做法就是在 ConfigureServices() 方法中將 MediaR 注入到 IServiceCollection 容器中,如下代碼所示:


                  // This method gets called by the runtime. Use this method to add services to the container.
                  public void ConfigureServices(IServiceCollection services)
                  {
                      services.AddMediatR(typeof(Startup));
                      services.AddControllers();
                  }

          使用 MediaR 處理 通知事件

          MediatR 支持兩種消息模式。

          • Request / Response 模式

          • Notification 模式

          這篇文章我們將會(huì)討論 Notification,接下來創(chuàng)建一個(gè)實(shí)現(xiàn) INotification 接口的類,如下代碼所示:


              public class LogEvent : INotification
              {
                  public string message;
                  public LogEvent(string message)
                  {
                      this.message = message;
                  }
              }

          為了能夠處理 LogEvent 事件,還需再創(chuàng)建一個(gè)實(shí)現(xiàn) INotificationHandler 接口的類,如下代碼所示:


              public class FileNotificationHandler : INotificationHandler<LogEvent>
              {
                  public Task Handle(LogEvent notification, CancellationToken cancellationToken)
                  {
                      string message = notification.message;

                      Log(message);

                      return Task.FromResult(0);
                  }

                  private void Log(string message)
                  {
                      //Write code here to log message(s) to a text file
                      Debug.WriteLine("Write code here to log message(s) to a text file");
                  }
              }

              public class DBNotificationHandler : INotificationHandler<LogEvent>
              {
                  public Task Handle(LogEvent notification, CancellationToken cancellationToken)
                  {
                      string message = notification.message;

                      Log(message);

                      return Task.FromResult(0);
                  }
                  private void Log(string message)
                  {
                      //Write code here to log message(s) to the database
                      Debug.WriteLine("Write code here to log message(s) to the database");
                  }
              }

          依賴注入 IMediator

          剛才我已經(jīng)為了 LogEvent 創(chuàng)建了兩個(gè)處理 handler 類,接下來就可以通過 依賴注入 的方式將其注入到 Controller 中,如下代碼所示:


              [ApiController]
              [Route("[controller]")]
              public class WeatherForecastController : ControllerBase
              {
                  private readonly ILogger<WeatherForecastController> _logger;
                  private readonly IMediator _mediator;

                  public WeatherForecastController(IMediator mediator, ILogger<WeatherForecastController> logger)
                  {
                      this._mediator = mediator;
                      this._logger = logger;
                  }
              }

          最后我們可以在 Action 中通過 publish 發(fā)布消息,如下代碼所示:


                  [HttpGet]
                  public IEnumerable<WeatherForecast> Get()
                  {
                      _mediator.Publish(new LogEvent("Hello World"));
                  }

          值得注意的是,執(zhí)行程序后將會(huì)調(diào)用上面的 publish 方法,繼而觸發(fā) DBNotificationHandler 和 FileNotificationHandler 的 Handle 方法,如下圖所示:

          中介者模式 是一種行為式的設(shè)計(jì)模式,它可以有效地管控多個(gè)對象之間的交互方式并有效的減少交互雙方的依賴關(guān)系,剛好 MediatR 就是這樣一款成品的 中介者模式 的實(shí)現(xiàn),關(guān)于 MediatR 的 request/response 模式,我會(huì)在后面的文章中和大家細(xì)說。

          譯文鏈接:https://www.infoworld.com/article/3393974/how-to-use-mediatr-in-aspnet-core.html



          往期精彩回顧




          【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程 ★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了

          10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了


          瀏覽 86
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  豆花视频无码 | 国产最新福利视频 | 亚洲人午夜射精精品日韩 | 日韩成人AV电影在线观看 | 小视频一区 |