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: 获取待重试消费的消息 → 返回空列表
使用场景
- 测试环境: 在单元测试中不需要真实的消息存储
- 开发环境: 快速原型开发,暂时跳过持久化逻辑
- 配置选择: 当系统配置为不使用消息存储时的默认实现
- 依赖注入: 作为默认注册,避免注入时的空引用异常
优势
- 避免空引用: 消除了对 null 检查的需要
- 简化代码: 调用方无需处理存储可能为空的情况
- 性能优化: 所有操作都是无操作,性能开销最小
- 类型安全: 提供了完整的接口实现,保持类型系统的完整性
这种设计在消息队列系统中非常有用,特别是在需要可选的消息持久化功能时。
评论加载中...