成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

代碼解耦之道:MediatR在.NET中的實戰應用

開發 開發工具
MediatR是一個強大的工具,可以幫助你構建松耦合、可維護的C#應用程序。通過分離請求和處理程序,它促進了關注點分離,并使得添加新功能和修改現有功能變得更加容易。

1. 引言

MediatR是一個輕量級的中介者模式實現庫,用于在.NET應用程序中處理進程內消息傳遞。它有助于降低代碼耦合度,提高可維護性和可測試性。本文將深入探討MediatR的使用方法,并提供多個實際示例。

2. MediatR的核心概念

在深入示例之前,讓我們先了解MediatR的幾個核心概念:

  1. 請求(Request): 表示要執行的操作。
  2. 處理程序(Handler): 負責處理特定類型的請求。
  3. 中介者(Mediator): 協調請求和處理程序之間的通信。

3. 安裝MediatR

首先,通過NuGet包管理器安裝MediatR:

dotnet add package MediatR

4. 基本用法示例

4.1 創建請求和處理程序

讓我們從一個簡單的示例開始,創建一個獲取用戶信息的請求:

public class GetUserQuery : IRequest<UserDto>
{
    public int UserId { get; set; }
}


public class GetUserQueryHandler : IRequestHandler<GetUserQuery, UserDto>
{
    public async Task<UserDto> Handle(GetUserQuery request, CancellationToken cancellationToken)
    {
        // 模擬從數據庫獲取用戶
        await Task.Delay(100, cancellationToken); // 模擬異步操作
        return new UserDto { Id = request.UserId, Name = $"User {request.UserId}" };
    }
}


public class UserDto
{
    public int Id { get; set; }
    public string Name { get; set; }
}

4.2 配置依賴注入

在Program.cs中配置MediatR:

builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));
4.3 使用MediatR發送請求

在控制器或服務中使用MediatR:

public class UserController : ControllerBase
{
    private readonly IMediator _mediator;


    public UserController(IMediator mediator)
    {
        _mediator = mediator;
    }


    [HttpGet("{id}")]
    public async Task<ActionResult<UserDto>> GetUser(int id)
    {
        var query = new GetUserQuery { UserId = id };
        var result = await _mediator.Send(query);
        return Ok(result);
    }
}

5. 高級用法示例

5.1 使用通知(Notification)

通知允許多個處理程序響應同一個事件:

public class UserCreatedNotification : INotification
{
    public int UserId { get; set; }
    public string UserName { get; set; }
}


public class EmailNotificationHandler : INotificationHandler<UserCreatedNotification>
{
    public Task Handle(UserCreatedNotification notification, CancellationToken cancellationToken)
    {
        Console.WriteLine($"Sending email for new user: {notification.UserName}");
        return Task.CompletedTask;
    }
}


public class LogNotificationHandler : INotificationHandler<UserCreatedNotification>
{
    public Task Handle(UserCreatedNotification notification, CancellationToken cancellationToken)
    {
        Console.WriteLine($"Logging new user creation: {notification.UserId}");
        return Task.CompletedTask;
    }
}

使用通知:

await _mediator.Publish(new UserCreatedNotification { UserId = 1, UserName = "John Doe" });

5.2 使用管道行為(Pipeline Behavior)

管道行為允許你在處理請求之前和之后執行代碼:

public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
    private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;


    public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
    {
        _logger = logger;
    }


    public async Task<TResponse> Handle(TRequest request,  RequestHandlerDelegate<TResponse> next,CancellationToken cancellationToken)
    {
        _logger.LogInformation($"開始處理請求 {typeof(TRequest).Name}");
        var response = await next();
        _logger.LogInformation($"完成處理請求 {typeof(TResponse).Name}");
        return response;
    }


}

注冊管道行為:

services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
觸發:
var query = new GetUserQuery { UserId = 1 };
var result = await _mediator.Send(query);
return Ok();

6. 實現請求重試機制

創建一個行為來自動重試失敗的請求:

public class RetryBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    where TRequest : IRequest<TResponse>
{
    private readonly ILogger<RetryBehavior<TRequest, TResponse>> _logger;
    private const int MaxRetries = 3;


    public RetryBehavior(ILogger<RetryBehavior<TRequest, TResponse>> logger)
{
        _logger = logger;
    }


    public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next, CancellationToken cancellationToken)
    {
        for (int i = 0; i <= MaxRetries; i++)
        {
            try
            {
                if (i > 0)
                {
                    _logger.LogWarning($"Retrying {typeof(TRequest).Name} (attempt {i})");
                }
                return await next();
            }
            catch (Exception ex) when (i < MaxRetries)
            {
                _logger.LogError(ex, $"Error handling {typeof(TRequest).Name}. Retry attempt {i + 1} of {MaxRetries}");
                await Task.Delay(1000 * i, cancellationToken);
            }
        }


        throw new Exception($"Failed to process {typeof(TRequest).Name} after {MaxRetries} retries.");
    }
}
// 在Program.cs中注冊
builder.Services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RetryBehavior<,>));

7. 最佳實踐

  1. 保持請求和處理程序的簡單性和單一職責。
  2. 使用通知處理跨切面關注點,如日志記錄和事件發布。
  3. 利用管道行為實現橫切關注點,如驗證、日志記錄和性能監控。
  4. 在大型項目中,考慮按功能或模塊組織請求和處理程序。
  5. 使用依賴注入容器管理MediatR和其他依賴項。

8. 結論

MediatR是一個強大的工具,可以幫助你構建松耦合、可維護的C#應用程序。通過分離請求和處理程序,它促進了關注點分離,并使得添加新功能和修改現有功能變得更加容易。結合CQRS模式,MediatR可以成為構建可擴展和高性能應用程序的有力工具。

責任編輯:武曉燕 來源: 技術老小子
相關推薦

2024-12-05 09:13:55

Go項目模塊

2020-11-20 15:22:32

架構運維技術

2009-02-27 16:22:34

AjaxProAjax.NET

2022-09-02 08:23:12

軟件開發解耦架構

2012-07-10 01:47:14

代碼架構設計

2024-09-30 09:48:41

RabbitMQ消息中間件

2025-05-20 07:13:22

Spring異步解耦Event

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構工具和方案

2023-12-29 09:01:10

SwiftUI空狀態Product?

2019-10-25 19:05:57

物聯網人工智能技術

2021-03-10 05:50:06

IOCReact解耦組件

2024-03-08 16:27:22

領域事件DDD項目跨層解耦

2025-06-04 08:10:00

發件箱模式.NET數據庫

2017-11-15 09:32:27

解耦戰術架構

2022-08-08 20:48:09

MQ消息中間件系統解耦

2021-04-13 16:18:30

人工智能強化學習人臉識別

2024-06-11 00:00:05

RabbitMQAMQP協議

2021-03-03 22:37:16

MediatR中介者模式

2022-04-15 11:46:09

輕量系統解耦鴻蒙操作系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩成人av在线 | 天天色天天色 | 毛片免费观看 | 日本成年免费网站 | 九九热精品在线视频 | 色久在线 | 亚洲一区视频 | 福利二区 | 欧美日韩视频在线第一区 | 国产二区在线播放 | 国产欧美在线 | 日本不卡一区二区三区在线观看 | 久久久久国产 | 91精品久久久久久久久 | 天天干狠狠 | 97精品超碰一区二区三区 | 国产亚洲一区二区在线观看 | 黄视频网址 | 日韩av一区二区在线观看 | 超碰操 | 国产精品揄拍一区二区 | 亚洲人成人网 | 日韩一区二区免费视频 | 成人精品一区二区三区中文字幕 | 欧美精品久久 | 欧美一区二区免费 | 日本精品视频一区二区三区四区 | 久久精品国产久精国产 | 成人免费观看视频 | 久久久久久国产精品 | 国产精品毛片无码 | 亚洲精品久久久久久久久久久久久 | 午夜精品久久久久久久久久久久久 | 在线不卡视频 | 欧美视频在线一区 | av一级 | 国内精品久久精品 | 日本不卡免费新一二三区 | 一区二区国产在线观看 | 91色啪| 精品国产一区二区三区久久 |