using Dpz.Core.MessageQueue.Abstractions;
using Dpz.Core.MessageQueue.Models;

namespace Dpz.Core.MessageQueue.RabbitMQ;

public sealed class NullMessageOutboxStore : IMessageOutboxStore
{
    public static readonly Lazy<NullMessageOutboxStore> Instance = new(() =>
        new NullMessageOutboxStore()
    );

    public Task CreateAsync(
        string messageId,
        string messageType,
        string exchange,
        string routingKey,
        string payload,
        string? source,
        CancellationToken cancellationToken = default
    ) => Task.CompletedTask;

    public Task MarkSentAsync(string messageId, CancellationToken cancellationToken = default) =>
        Task.CompletedTask;

    public Task MarkPublishFailedAsync(
        string messageId,
        string error,
        CancellationToken cancellationToken = default
    ) => Task.CompletedTask;

    public Task MarkConsumedAsync(
        string messageId,
        CancellationToken cancellationToken = default
    ) => Task.CompletedTask;

    public Task MarkConsumeFailedAsync(
        string messageId,
        string error,
        CancellationToken cancellationToken = default
    ) => Task.CompletedTask;

    public Task<IReadOnlyList<MessageOutboxEntry>> GetPendingPublishRetryAsync(
        int batchSize,
        CancellationToken cancellationToken = default
    ) => Task.FromResult<IReadOnlyList<MessageOutboxEntry>>([]);

    public Task<IReadOnlyList<MessageOutboxEntry>> GetPendingConsumeRetryAsync(
        int batchSize,
        CancellationToken cancellationToken = default
    ) => Task.FromResult<IReadOnlyList<MessageOutboxEntry>>([]);
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这个代码文件定义了一个名为 NullMessageOutboxStore 的类,它是**空对象模式(Null Object Pattern)**的经典实现。以下是详细解释:

设计模式和用途

这是一个空对象模式的实现,用于提供 IMessageOutboxStore 接口的"无操作"版本。在消息队列系统中,当不需要实际的消息存储功能时,可以使用这个类来避免空引用检查。

主要特征

1. 单例模式

public static readonly Lazy<NullMessageOutboxStore> Instance = new(() =>
    new NullMessageOutboxStore()
);
  • 使用 Lazy<T> 实现线程安全的单例
  • 延迟初始化,只在首次访问时创建实例

2. 接口实现

实现了 IMessageOutboxStore 接口的所有方法,但都是"空实现":

  • CreateAsync: 创建消息记录 → 返回已完成的任务
  • MarkSentAsync: 标记消息已发送 → 返回已完成的任务
  • MarkPublishFailedAsync: 标记发布失败 → 返回已完成的任务
  • MarkConsumedAsync: 标记消息已消费 → 返回已完成的任务
  • MarkConsumeFailedAsync: 标记消费失败 → 返回已完成的任务
  • GetPendingPublishRetryAsync: 获取待重试发布的消息 → 返回空列表
  • GetPendingConsumeRetryAsync: 获取待重试消费的消息 → 返回空列表

使用场景

  1. 测试环境: 在单元测试中不需要真实的消息存储
  2. 开发环境: 快速原型开发,暂时跳过持久化逻辑
  3. 配置选择: 当系统配置为不使用消息存储时的默认实现
  4. 依赖注入: 作为默认注册,避免注入时的空引用异常

优势

  • 避免空引用: 消除了对 null 检查的需要
  • 简化代码: 调用方无需处理存储可能为空的情况
  • 性能优化: 所有操作都是无操作,性能开销最小
  • 类型安全: 提供了完整的接口实现,保持类型系统的完整性

这种设计在消息队列系统中非常有用,特别是在需要可选的消息持久化功能时。

评论加载中...