using Dpz.Core.MessageQueue.Abstractions;
using Dpz.Core.MessageQueue.Models;
using Dpz.Core.Public.ViewModel.Messages;
using Dpz.Core.Web.Jobs.Services;
namespace Dpz.Core.Web.Jobs.MessageHandlers;
/// <summary>
/// 发送管理员邮件通知处理器
/// </summary>
public class SendMasterEmailHandler(
EmailSenderHelper emailSenderHelper,
ILogger<SendMasterEmailHandler> logger
) : IMessageHandler<SendMasterEmailMessage>
{
public async Task<MessageHandlerResult> HandleAsync(
SendMasterEmailMessage message,
CancellationToken cancellationToken
)
{
try
{
if (!emailSenderHelper.IsServiceEnabled)
{
logger.LogWarning("邮件服务未启用,跳过发送");
return MessageHandlerResult.Ok();
}
await emailSenderHelper.SendMasterNotificationAsync(
message.NickName,
message.Email,
message.CommentText,
message.SendTime,
cancellationToken
);
logger.LogInformation(
"管理员邮件通知发送成功: NickName={NickName}, Email={Email}",
message.NickName,
message.Email
);
return MessageHandlerResult.Ok();
}
catch (Exception ex)
{
logger.LogError(
ex,
"管理员邮件通知发送失败: NickName={NickName}, Email={Email}",
message.NickName,
message.Email
);
return MessageHandlerResult.Fail($"管理员邮件通知发送失败: {ex.Message}");
}
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
代码解释
这是一个异步消息处理器类,用于处理"发送管理员邮件通知"的业务逻辑。
整体结构
1. 类定义
public class SendMasterEmailHandler : IMessageHandler<SendMasterEmailMessage>
- 实现了
IMessageHandler<SendMasterEmailMessage>接口 - 专门处理
SendMasterEmailMessage类型的消息 - 使用了 C# 12 主构造函数语法进行依赖注入
2. 依赖注入
通过主构造函数注入两个依赖:
EmailSenderHelper:邮件发送辅助类,负责实际的邮件发送操作ILogger<SendMasterEmailHandler>:日志记录器
核心方法:HandleAsync
这是消息处理的核心逻辑,采用标准的异常处理模式:
处理流程
- 服务可用性检查
if (!emailSenderHelper.IsServiceEnabled)
{
logger.LogWarning("邮件服务未启用,跳过发送");
return MessageHandlerResult.Ok();
}
- 检查邮件服务是否启用
- 未启用时记录警告日志并返回成功(避免消息重试)
- 发送邮件
await emailSenderHelper.SendMasterNotificationAsync(
message.NickName,
message.Email,
message.CommentText,
message.SendTime,
cancellationToken
);
- 调用邮件发送服务
- 传递消息中的参数(昵称、邮箱、评论内容、发送时间)
- 支持取消令牌(可中断操作)
- 成功日志
logger.LogInformation(
"管理员邮件通知发送成功: NickName={NickName}, Email={Email}",
message.NickName,
message.Email
);
- 使用结构化日志记录成功信息
- 异常处理
catch (Exception ex)
{
logger.LogError(ex, "管理员邮件通知发送失败: ...");
return MessageHandlerResult.Fail($"管理员邮件通知发送失败: {ex.Message}");
}
- 捕获所有异常
- 记录详细错误日志
- 返回失败结果(可能会触发消息队列重试机制)
设计模式与特点
| 特性 | 说明 |
|---|---|
| 消息驱动 | 通过消息队列解耦邮件发送逻辑 |
| 异步处理 | 使用 async/await 避免阻塞 |
| 防御性编程 | 检查服务状态、全面的异常处理 |
| 可观测性 | 完善的日志记录(Info/Warning/Error) |
| 优雅降级 | 服务未启用时静默跳过而非报错 |
适用场景
典型的评论通知场景:
- 用户在博客/文章下发表评论
- 系统将通知任务放入消息队列
- 该处理器从队列获取消息并发送邮件给管理员
- 即使邮件发送失败,也不影响主业务流程
AI 正在分析代码…
评论加载中...