admin管理员组

文章数量:1029433

在ASP.NET Core中使用MediatR实现通知系统

MediatR 是一个流行的开源库,用于在.NET应用中实现中介者模式(Mediator Pattern)。它通过封装消息的发送与处理逻辑,提供了一种简洁优雅的组件间通信方式。

虽然常与CQRS(命令查询职责分离)架构结合使用,但其应用场景不仅限于此。开发者可通过创建简单的C#命令/查询类及对应的处理程序,利用MediatR将请求分发给相应处理逻辑。此外,MediatR还支持实现通知系统。

本文将以用户注册系统为例,展示如何在ASP.NET Core中利用MediatR的通知功能实现事件驱动的解耦架构。

场景描述

在用户管理系统中,当新用户注册时,系统需执行以下操作:

  1. 1. 发送欢迎邮件
  2. 2. 记录注册日志(用于审计)
  3. 3. 通知分析服务

传统实现可能导致服务间紧耦合,而MediatR的通知机制可优雅解决此问题。

分步实现(.NET 9)

1. 定义通知事件

用户注册时触发INotification事件:

代码语言:javascript代码运行次数:0运行复制
using MediatR;  

publicclassUserRegisteredNotification : INotification
{  
    publicstring UserId { get; }  
    publicstring Email { get; }  

    public UserRegisteredNotification(string userId, string email)
    {  
        UserId = userId;  
        Email = email;  
    }  
}  

2. 为不同操作创建处理程序

各服务独立订阅同一事件。

处理程序1:发送欢迎邮件

代码语言:javascript代码运行次数:0运行复制
public classSendWelcomeEmailHandler : INotificationHandler<UserRegisteredNotification>  
{  
    privatereadonly ILogger<SendWelcomeEmailHandler> _logger;  

    public SendWelcomeEmailHandler(ILogger<SendWelcomeEmailHandler> logger)
        => _logger = logger;  

    public Task Handle(UserRegisteredNotification notification, CancellationToken cancellationToken)
    {  
        _logger.LogInformation($"向 {notification.Email} 发送欢迎邮件");  
        // 模拟邮件发送逻辑  
        return Task.CompletedTask;  
    }  
}  

处理程序2:记录注册日志

代码语言:javascript代码运行次数:0运行复制
public classLogUserRegistrationHandler : INotificationHandler<UserRegisteredNotification>  
{  
    privatereadonly ILogger<LogUserRegistrationHandler> _logger;  

    public LogUserRegistrationHandler(ILogger<LogUserRegistrationHandler> logger)
        => _logger = logger;  

    public Task Handle(UserRegisteredNotification notification, CancellationToken cancellationToken)
    {  
        _logger.LogInformation($"用户注册:ID {notification.UserId}, 邮箱 {notification.Email}");  
        return Task.CompletedTask;  
    }  
}  

处理程序3:通知分析服务

代码语言:javascript代码运行次数:0运行复制
public classAnalyticsServiceHandler : INotificationHandler<UserRegisteredNotification>  
{  
    privatereadonly ILogger<AnalyticsServiceHandler> _logger;  

    public AnalyticsServiceHandler(ILogger<AnalyticsServiceHandler> logger)
        => _logger = logger;  

    public Task Handle(UserRegisteredNotification notification, CancellationToken cancellationToken)
    {  
        _logger.LogInformation($"分析服务:追踪新用户注册 {notification.UserId}");  
        return Task.CompletedTask;  
    }  
}  

3. 配置MediatR并发布通知

Program.cs中注册MediatR并实现用户注册端点:

代码语言:javascript代码运行次数:0运行复制
var builder = WebApplication.CreateBuilder(args);  

// 注册MediatR  
builder.Services.AddMediatR(Assembly.GetExecutingAssembly());  

var app = builder.Build();  

// 用户注册的极简API端点  
app.MapPost("/register", async (UserRegistrationRequest request, IMediator mediator) =>  
{  
    var userId = Guid.NewGuid().ToString();  

    // 模拟用户注册(如保存至数据库)  
    await mediator.Publish(new UserRegisteredNotification(userId, request.Email));  

    return Results.Ok(new { Message = "用户注册成功!", UserId = userId });  
});  

app.Run();  

// 用户注册请求DTO  
public record UserRegistrationRequest(string Email);  

为何选择MediatR?

组件解耦:邮件服务、日志服务与分析服务相互独立。 ✅ 可扩展性:新增处理程序(如短信通知)无需修改现有代码。 ✅ 可测试性:各处理程序可单独测试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-21,如有侵权请联系 cloudcommunity@tencent 删除系统aspcore服务事件

在ASP.NET Core中使用MediatR实现通知系统

MediatR 是一个流行的开源库,用于在.NET应用中实现中介者模式(Mediator Pattern)。它通过封装消息的发送与处理逻辑,提供了一种简洁优雅的组件间通信方式。

虽然常与CQRS(命令查询职责分离)架构结合使用,但其应用场景不仅限于此。开发者可通过创建简单的C#命令/查询类及对应的处理程序,利用MediatR将请求分发给相应处理逻辑。此外,MediatR还支持实现通知系统。

本文将以用户注册系统为例,展示如何在ASP.NET Core中利用MediatR的通知功能实现事件驱动的解耦架构。

场景描述

在用户管理系统中,当新用户注册时,系统需执行以下操作:

  1. 1. 发送欢迎邮件
  2. 2. 记录注册日志(用于审计)
  3. 3. 通知分析服务

传统实现可能导致服务间紧耦合,而MediatR的通知机制可优雅解决此问题。

分步实现(.NET 9)

1. 定义通知事件

用户注册时触发INotification事件:

代码语言:javascript代码运行次数:0运行复制
using MediatR;  

publicclassUserRegisteredNotification : INotification
{  
    publicstring UserId { get; }  
    publicstring Email { get; }  

    public UserRegisteredNotification(string userId, string email)
    {  
        UserId = userId;  
        Email = email;  
    }  
}  

2. 为不同操作创建处理程序

各服务独立订阅同一事件。

处理程序1:发送欢迎邮件

代码语言:javascript代码运行次数:0运行复制
public classSendWelcomeEmailHandler : INotificationHandler<UserRegisteredNotification>  
{  
    privatereadonly ILogger<SendWelcomeEmailHandler> _logger;  

    public SendWelcomeEmailHandler(ILogger<SendWelcomeEmailHandler> logger)
        => _logger = logger;  

    public Task Handle(UserRegisteredNotification notification, CancellationToken cancellationToken)
    {  
        _logger.LogInformation($"向 {notification.Email} 发送欢迎邮件");  
        // 模拟邮件发送逻辑  
        return Task.CompletedTask;  
    }  
}  

处理程序2:记录注册日志

代码语言:javascript代码运行次数:0运行复制
public classLogUserRegistrationHandler : INotificationHandler<UserRegisteredNotification>  
{  
    privatereadonly ILogger<LogUserRegistrationHandler> _logger;  

    public LogUserRegistrationHandler(ILogger<LogUserRegistrationHandler> logger)
        => _logger = logger;  

    public Task Handle(UserRegisteredNotification notification, CancellationToken cancellationToken)
    {  
        _logger.LogInformation($"用户注册:ID {notification.UserId}, 邮箱 {notification.Email}");  
        return Task.CompletedTask;  
    }  
}  

处理程序3:通知分析服务

代码语言:javascript代码运行次数:0运行复制
public classAnalyticsServiceHandler : INotificationHandler<UserRegisteredNotification>  
{  
    privatereadonly ILogger<AnalyticsServiceHandler> _logger;  

    public AnalyticsServiceHandler(ILogger<AnalyticsServiceHandler> logger)
        => _logger = logger;  

    public Task Handle(UserRegisteredNotification notification, CancellationToken cancellationToken)
    {  
        _logger.LogInformation($"分析服务:追踪新用户注册 {notification.UserId}");  
        return Task.CompletedTask;  
    }  
}  

3. 配置MediatR并发布通知

Program.cs中注册MediatR并实现用户注册端点:

代码语言:javascript代码运行次数:0运行复制
var builder = WebApplication.CreateBuilder(args);  

// 注册MediatR  
builder.Services.AddMediatR(Assembly.GetExecutingAssembly());  

var app = builder.Build();  

// 用户注册的极简API端点  
app.MapPost("/register", async (UserRegistrationRequest request, IMediator mediator) =>  
{  
    var userId = Guid.NewGuid().ToString();  

    // 模拟用户注册(如保存至数据库)  
    await mediator.Publish(new UserRegisteredNotification(userId, request.Email));  

    return Results.Ok(new { Message = "用户注册成功!", UserId = userId });  
});  

app.Run();  

// 用户注册请求DTO  
public record UserRegistrationRequest(string Email);  

为何选择MediatR?

组件解耦:邮件服务、日志服务与分析服务相互独立。 ✅ 可扩展性:新增处理程序(如短信通知)无需修改现有代码。 ✅ 可测试性:各处理程序可单独测试。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-21,如有侵权请联系 cloudcommunity@tencent 删除系统aspcore服务事件

本文标签: 在ASPNET Core中使用MediatR实现通知系统