<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MediatR 在 .NET Core 中的詳細(xì)用法和深入講解

       

      MediatR 是 .NET 中的一種實(shí)現(xiàn) 中介者模式(Mediator Pattern) 的庫(kù)。它允許您將應(yīng)用程序中的請(qǐng)求和響應(yīng)解耦,使各個(gè)組件通過(guò)一個(gè)中介者進(jìn)行通信,避免了直接依賴,從而使得代碼更加松耦合,易于擴(kuò)展和維護(hù)。

      MediatR 被廣泛應(yīng)用于 ASP.NET Core 應(yīng)用程序中,尤其是在處理復(fù)雜業(yè)務(wù)邏輯和請(qǐng)求響應(yīng)時(shí)。本篇文章將深入講解 MediatR 的安裝、配置、使用場(chǎng)景、代碼示例以及一些高級(jí)功能。

      1. MediatR 的安裝與配置

      在使用 MediatR 前,首先需要安裝其 NuGet 包。MediatR 的核心庫(kù)以及用于與 ASP.NET Core 集成的擴(kuò)展庫(kù)可以通過(guò) NuGet 安裝。

      1.1 安裝 NuGet 包

      通過(guò) NuGet 包管理器安裝 MediatR:

      Install-Package MediatR
      Install-Package MediatR.Extensions.Microsoft.DependencyInjection
      

      或者通過(guò) .NET CLI 安裝:

      dotnet add package MediatR
      dotnet add package MediatR.Extensions.Microsoft.DependencyInjection
      

      1.2 配置 MediatR

      在 ASP.NET Core 應(yīng)用程序中配置 MediatR。通常你會(huì)在 Program.cs 文件中配置 MediatR 服務(wù)。

      using MediatR;
      using Microsoft.Extensions.DependencyInjection;
      using System.Reflection;
      
      var builder = WebApplication.CreateBuilder(args);
      
      // 注冊(cè) MediatR 服務(wù)
      builder.Services.AddMediatR(Assembly.GetExecutingAssembly());
      
      var app = builder.Build();
      
      app.MapGet("/", () => "Hello World!");
      
      app.Run();
      

      AddMediatR() 會(huì)掃描指定的程序集,在本例中是 Assembly.GetExecutingAssembly(),自動(dòng)注冊(cè)應(yīng)用中定義的請(qǐng)求和處理程序。

      2. 請(qǐng)求與處理程序的基本用法

      MediatR 使用 請(qǐng)求/響應(yīng)模式,即客戶端通過(guò)請(qǐng)求發(fā)送數(shù)據(jù),并由處理程序處理后返回響應(yīng)。請(qǐng)求通常是實(shí)現(xiàn) IRequest<TResponse> 接口的類,TResponse 是請(qǐng)求的響應(yīng)類型。處理程序需要實(shí)現(xiàn) IRequestHandler<TRequest, TResponse> 接口來(lái)處理請(qǐng)求。

      2.1 創(chuàng)建請(qǐng)求類

      請(qǐng)求類實(shí)現(xiàn) IRequest<TResponse> 接口,表示希望返回某種類型的響應(yīng)。

      public class MyRequest : IRequest<string>
      {
          public string Name { get; set; }
      }
      

      MyRequest 是一個(gè)請(qǐng)求類,它有一個(gè) Name 屬性,并且返回一個(gè) string 類型的響應(yīng)。

      2.2 創(chuàng)建處理程序

      處理程序是實(shí)現(xiàn)了 IRequestHandler<TRequest, TResponse> 接口的類。處理程序中會(huì)定義如何處理請(qǐng)求,并生成響應(yīng)。

      using MediatR;
      using System.Threading;
      using System.Threading.Tasks;
      
      public class MyRequestHandler : IRequestHandler<MyRequest, string>
      {
          public Task<string> Handle(MyRequest request, CancellationToken cancellationToken)
          {
              // 在這里處理請(qǐng)求的業(yè)務(wù)邏輯
              return Task.FromResult($"Hello, {request.Name}!");
          }
      }
      

      MyRequestHandler 處理 MyRequest 請(qǐng)求,并返回一個(gè)字符串響應(yīng),格式為 "Hello, [Name]!"

      2.3 發(fā)送請(qǐng)求

      請(qǐng)求通過(guò) IMediator 接口發(fā)送,IMediator 是 MediatR 中的核心組件。你可以將它注入到控制器或者服務(wù)中,然后通過(guò)調(diào)用 Send 方法發(fā)送請(qǐng)求。

      using MediatR;
      using Microsoft.AspNetCore.Mvc;
      using System.Threading.Tasks;
      
      [ApiController]
      [Route("api/[controller]")]
      public class MyController : ControllerBase
      {
          private readonly IMediator _mediator;
      
          public MyController(IMediator mediator)
          {
              _mediator = mediator;
          }
      
          [HttpGet]
          public async Task<IActionResult> Get([FromQuery] string name)
          {
              var request = new MyRequest { Name = name };
              var response = await _mediator.Send(request);  // 發(fā)送請(qǐng)求并獲取響應(yīng)
              return Ok(response);  // 返回響應(yīng)
          }
      }
      

      MyController 控制器中,我們通過(guò)構(gòu)造函數(shù)注入了 IMediator,并在 Get 方法中發(fā)送了 MyRequest 請(qǐng)求。響應(yīng)會(huì)被返回給客戶端。

      3. 使用通知(Notification)與通知處理程序

      除了請(qǐng)求/響應(yīng)模式,MediatR 還支持 通知模式,通知類似于事件,它允許多個(gè)處理程序同時(shí)處理同一條通知。

      3.1 創(chuàng)建通知類

      通知類實(shí)現(xiàn) INotification 接口,通常不返回響應(yīng)數(shù)據(jù)。通知用于傳播事件或某種狀態(tài)變化。

      public class MyNotification : INotification
      {
          public string Message { get; set; }
      }
      

      MyNotification 是一個(gè)簡(jiǎn)單的通知類,包含一個(gè) Message 屬性。

      3.2 創(chuàng)建通知處理程序

      通知處理程序是實(shí)現(xiàn)了 INotificationHandler<TNotification> 接口的類。一個(gè)通知可以由多個(gè)處理程序處理。

      public class MyNotificationHandler : INotificationHandler<MyNotification>
      {
          public Task Handle(MyNotification notification, CancellationToken cancellationToken)
          {
              // 處理通知的邏輯
              Console.WriteLine($"Notification received: {notification.Message}");
              return Task.CompletedTask;
          }
      }
      

      MyNotificationHandler 中,我們處理了 MyNotification 通知,簡(jiǎn)單地將通知內(nèi)容輸出到控制臺(tái)。

      3.3 發(fā)布通知

      與請(qǐng)求發(fā)送類似,發(fā)布通知也通過(guò) IMediator 完成。通知通過(guò) Publish 方法發(fā)布。

      [HttpPost]
      public async Task<IActionResult> Post([FromBody] string message)
      {
          var notification = new MyNotification { Message = message };
          await _mediator.Publish(notification);  // 發(fā)布通知
          return Ok();
      }
      

      當(dāng)收到 POST 請(qǐng)求時(shí),我們創(chuàng)建并發(fā)布 MyNotification 通知,所有注冊(cè)的處理程序都會(huì)處理該通知。

      4. 管道行為(Pipeline Behavior)

      MediatR 支持 管道行為(Pipeline Behavior),它允許你在請(qǐng)求和響應(yīng)的生命周期中插入自定義邏輯。例如,你可以在請(qǐng)求之前或之后添加日志記錄、驗(yàn)證、緩存等操作。

      4.1 創(chuàng)建管道行為

      管道行為實(shí)現(xiàn) IPipelineBehavior<TRequest, TResponse> 接口,允許你控制請(qǐng)求的處理過(guò)程。

      using MediatR;
      using System;
      using System.Threading;
      using System.Threading.Tasks;
      
      public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
      {
          public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
          {
              // 在請(qǐng)求之前執(zhí)行的邏輯
              Console.WriteLine($"Handling {typeof(TRequest).Name}");
      
              // 調(diào)用下一個(gè)請(qǐng)求處理程序
              var response = await next();
      
              // 在響應(yīng)之后執(zhí)行的邏輯
              Console.WriteLine($"Handled {typeof(TResponse).Name}");
              return response;
          }
      }
      

      LoggingBehavior 中,我們?cè)谡?qǐng)求處理之前和之后分別記錄了日志。

      4.2 注冊(cè)管道行為

      Program.cs 文件中,使用依賴注入注冊(cè)管道行為。

      builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
      

      這使得每個(gè)請(qǐng)求都會(huì)經(jīng)過(guò)管道行為處理。

      5. 異常處理

      MediatR 本身沒(méi)有內(nèi)置的異常處理機(jī)制,但你可以通過(guò)管道行為來(lái)處理異常。以下是一個(gè)簡(jiǎn)單的異常處理示例:

      public class ExceptionHandlingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
      {
          public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
          {
              try
              {
                  return await next();
              }
              catch (Exception ex)
              {
                  // 記錄異常或進(jìn)行其他處理
                  Console.WriteLine($"An error occurred: {ex.Message}");
                  throw;
              }
          }
      }
      

      然后,在 Program.cs 中注冊(cè)此異常處理行為:

      builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ExceptionHandlingBehavior<,>));
      

      6. 總結(jié)

      MediatR 是一個(gè)強(qiáng)大的庫(kù),幫助你實(shí)現(xiàn)松耦合、易擴(kuò)展的請(qǐng)求/響應(yīng)模式和通知模式。它在大多數(shù)應(yīng)用場(chǎng)景中都非常有用,尤其是當(dāng)你的應(yīng)用程序邏輯比較復(fù)雜時(shí)。通過(guò) MediatR,你可以更好地組織你的代碼,使得不同的組件之間解耦,提高可維護(hù)性。

      主要功能包括:

      • 請(qǐng)求/響應(yīng)模式:通過(guò)請(qǐng)求類和處理程序來(lái)實(shí)現(xiàn)操作邏輯。
      • 通知模式:發(fā)布通知,多個(gè)處理程序同時(shí)處理同一條通知。
      • 管道行為:在請(qǐng)求生命周期中插入自定義邏輯,如日志記錄、異常處理等。
      • 輕松集成:通過(guò)簡(jiǎn)單的依賴注入和配置,MediatR 可以輕松集成到 ASP.NET Core 應(yīng)用中。

      MediatR 通過(guò)實(shí)現(xiàn)中介者模式,不僅提高了代碼的解耦性,還使得復(fù)雜的操作變得更加清晰和可擴(kuò)展。

      posted @ 2025-03-11 10:17  努力,努力再努力  閱讀(607)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产AV国片精品有毛| 亚洲成a人片在线观看中| 成人乱码一区二区三区四区| 97精品人妻系列无码人妻| 成人拍拍拍无遮挡免费视频 | jizzjizz日本高潮喷水| 亚洲精品国产一二三区| 国产亚洲欧美精品久久久| 国产互换人妻xxxx69| 99久久er热在这里只有精品99 | 亚洲国产在一区二区三区| 国产亚洲人成网站在线观看 | 日本中文字幕乱码免费| 九九热久久只有精品2| 91区国产福利在线观看午夜 | 国产精品va无码一区二区| 久久天堂无码av网站| 国产一区二区三区精品综合| 亚洲中文字幕一区二区| 国产资源精品中文字幕| 无码里番纯肉h在线网站| 黄色免费在线网址| 国产午夜亚洲精品一区| 午夜福利片1000无码免费| 国产高清视频一区二区乱| 精品无码三级在线观看视频 | 动漫精品专区一区二区三区| 国产精品揄拍一区二区久久| 日韩精品中文字幕有码| 99国产精品久久久久久久日本竹 | 老色鬼在线精品视频在线观看| 久久久久综合中文字幕| 亚洲精品中文字幕二区| 亚洲AV永久无码精品秋霞电影影院 | 国产中文字幕精品视频| 日韩大片高清播放器| 成人亚洲国产精品一区不卡| 日韩精品一区二区高清视频| 国产成人亚洲精品狼色在线| 亚洲av天堂综合网久久| 欧美巨大极度另类|