using Dpz.Core.MessageQueue.Abstractions;
using Dpz.Core.MessageQueue.Models;
using Dpz.Core.Public.ViewModel.Messages;
using Dpz.Core.Service.RepositoryService;

namespace Dpz.Core.Web.Jobs.MessageHandlers;

/// <summary>
/// 增加弹幕计数消息处理器
/// 更新视频的弹幕数量并刷新缓存
/// </summary>
public class AddDanmakuCountHandler(
    IVideoService videoService,
    IBarrageService barrageService,
    ILogger<AddDanmakuCountHandler> logger
) : IMessageHandler<AddDanmakuCountMessage>
{
    public async Task<MessageHandlerResult> HandleAsync(
        AddDanmakuCountMessage message,
        CancellationToken cancellationToken
    )
    {
        try
        {
            // 获取最新弹幕数量
            var count = await barrageService.GetGroupBarrageCountAsync(message.DanmakuGroup);

            // 更新数据库和缓存
            await videoService.UpdateDanmakuCountAsync(
                message.DanmakuGroup,
                count,
                cancellationToken
            );

            logger.LogInformation(
                "弹幕计数更新成功: DanmakuGroup={DanmakuGroup}, Count={Count}",
                message.DanmakuGroup,
                count
            );

            return MessageHandlerResult.Ok();
        }
        catch (Exception ex)
        {
            logger.LogError(
                ex,
                "弹幕计数更新失败: DanmakuGroup={DanmakuGroup}",
                message.DanmakuGroup
            );
            return MessageHandlerResult.Fail($"弹幕计数更新失败: {ex.Message}");
        }
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个 消息处理器(Message Handler) 类,用于处理弹幕计数更新的业务逻辑。

📋 类概述

类名: AddDanmakuCountHandler
用途: 当有新弹幕添加时,更新对应视频的弹幕总数并刷新缓存

🏗️ 架构特点

1. 依赖注入(Primary Constructor)

public class AddDanmakuCountHandler(
    IVideoService videoService,
    IBarrageService barrageService,
    ILogger<AddDanmakuCountHandler> logger
)

使用 C# 12 的主构造函数特性,注入三个依赖:

  • IVideoService: 视频服务,用于更新视频信息
  • IBarrageService: 弹幕服务,用于获取弹幕统计数据
  • ILogger: 日志记录器

2. 实现接口

: IMessageHandler<AddDanmakuCountMessage>

实现了泛型消息处理器接口,专门处理 AddDanmakuCountMessage 类型的消息

🔄 核心处理流程

HandleAsync 方法执行步骤:

  1. 获取最新弹幕数量

    var count = await barrageService.GetGroupBarrageCountAsync(message.DanmakuGroup);
    

    根据弹幕分组 ID 查询该分组的弹幕总数

  2. 更新数据库和缓存

    await videoService.UpdateDanmakuCountAsync(
        message.DanmakuGroup,
        count,
        cancellationToken
    );
    

    将最新的弹幕数量同步到数据库并更新缓存

  3. 记录成功日志

    logger.LogInformation(
        "弹幕计数更新成功: DanmakuGroup={DanmakuGroup}, Count={Count}",
        message.DanmakuGroup,
        count
    );
    
  4. 返回处理结果

    • 成功: MessageHandlerResult.Ok()
    • 失败: MessageHandlerResult.Fail(错误信息)

⚠️ 异常处理

使用 try-catch 捕获所有异常:

  • 记录详细错误日志
  • 返回失败结果,包含错误消息
  • 保证消息处理的健壮性

🎯 应用场景

典型的异步消息队列处理模式,适用于:

  • 弹幕数量实时统计
  • 避免频繁数据库写入
  • 解耦弹幕发送和计数更新逻辑
  • 提高系统响应性能

💡 设计优势

✅ 职责单一
✅ 异步处理
✅ 完善的日志记录
✅ 结构化异常处理
✅ 支持取消操作(CancellationToken)

评论加载中...