admin管理员组文章数量:1029433
在ASP.NET Core中使用MediatR实现通知系统
MediatR 是一个流行的开源库,用于在.NET应用中实现中介者模式(Mediator Pattern)。它通过封装消息的发送与处理逻辑,提供了一种简洁优雅的组件间通信方式。
虽然常与CQRS(命令查询职责分离)架构结合使用,但其应用场景不仅限于此。开发者可通过创建简单的C#命令/查询类及对应的处理程序,利用MediatR将请求分发给相应处理逻辑。此外,MediatR还支持实现通知系统。
本文将以用户注册系统为例,展示如何在ASP.NET Core中利用MediatR的通知功能实现事件驱动的解耦架构。
场景描述
在用户管理系统中,当新用户注册时,系统需执行以下操作:
- 1. 发送欢迎邮件
- 2. 记录注册日志(用于审计)
- 3. 通知分析服务
传统实现可能导致服务间紧耦合,而MediatR的通知机制可优雅解决此问题。
分步实现(.NET 9)
1. 定义通知事件
用户注册时触发INotification
事件:
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并实现用户注册端点:
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. 发送欢迎邮件
- 2. 记录注册日志(用于审计)
- 3. 通知分析服务
传统实现可能导致服务间紧耦合,而MediatR的通知机制可优雅解决此问题。
分步实现(.NET 9)
1. 定义通知事件
用户注册时触发INotification
事件:
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并实现用户注册端点:
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实现通知系统
版权声明:本文标题:在ASP.NET Core中使用MediatR实现通知系统 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747583569a2181762.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论