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

这是消息处理的核心逻辑,采用标准的异常处理模式

处理流程

  1. 服务可用性检查
if (!emailSenderHelper.IsServiceEnabled)
{
    logger.LogWarning("邮件服务未启用,跳过发送");
    return MessageHandlerResult.Ok();
}
  • 检查邮件服务是否启用
  • 未启用时记录警告日志并返回成功(避免消息重试)
  1. 发送邮件
await emailSenderHelper.SendMasterNotificationAsync(
    message.NickName,
    message.Email,
    message.CommentText,
    message.SendTime,
    cancellationToken
);
  • 调用邮件发送服务
  • 传递消息中的参数(昵称、邮箱、评论内容、发送时间)
  • 支持取消令牌(可中断操作)
  1. 成功日志
logger.LogInformation(
    "管理员邮件通知发送成功: NickName={NickName}, Email={Email}",
    message.NickName,
    message.Email
);
  • 使用结构化日志记录成功信息
  1. 异常处理
catch (Exception ex)
{
    logger.LogError(ex, "管理员邮件通知发送失败: ...");
    return MessageHandlerResult.Fail($"管理员邮件通知发送失败: {ex.Message}");
}
  • 捕获所有异常
  • 记录详细错误日志
  • 返回失败结果(可能会触发消息队列重试机制)

设计模式与特点

特性说明
消息驱动通过消息队列解耦邮件发送逻辑
异步处理使用 async/await 避免阻塞
防御性编程检查服务状态、全面的异常处理
可观测性完善的日志记录(Info/Warning/Error)
优雅降级服务未启用时静默跳过而非报错

适用场景

典型的评论通知场景

  • 用户在博客/文章下发表评论
  • 系统将通知任务放入消息队列
  • 该处理器从队列获取消息并发送邮件给管理员
  • 即使邮件发送失败,也不影响主业务流程
评论加载中...