namespace Dpz.Core.MessageQueue.Enums;

/// <summary>
/// RabbitMQ Exchange 类型枚举
/// </summary>
public enum ExchangeType
{
    /// <summary>
    /// 直接路由:精确匹配路由键
    /// 用途:点对点消息传递,如订单系统中特定用户的通知
    /// 示例:routing key "order.created" 只发送到绑定了 "order.created" 的队列
    /// </summary>
    Direct,

    /// <summary>
    /// 主题路由:支持通配符匹配路由键
    /// 用途:发布/订阅模式,支持灵活的消息分类
    /// 通配符:
    ///   * (星号) - 匹配一个单词,如 "order.*.created" 匹配 "order.user.created"
    ///   # (井号) - 匹配零个或多个单词,如 "order.#" 匹配 "order.user.created.success"
    /// 示例:
    ///   routing key "news.tech.ai"
    ///   可被 "news.tech.*" 或 "news.#" 的队列接收
    /// </summary>
    Topic,

    /// <summary>
    /// 广播路由:忽略路由键,发送到所有绑定的队列
    /// 用途:消息广播,如系统配置更新、缓存清除通知
    /// 示例:一条消息发送到所有订阅的微服务实例
    /// 性能:最快的路由方式,无需匹配路由键
    /// </summary>
    Fanout,

    /// <summary>
    /// 头部路由:根据消息头(Headers)属性匹配,忽略路由键
    /// 用途:复杂的路由规则,如根据消息优先级、来源、类型等多个维度路由
    /// 匹配模式:
    ///   x-match: all - 所有头部属性都匹配(AND)
    ///   x-match: any - 任一头部属性匹配(OR)
    /// 示例:根据 {"priority": "high", "type": "alert"} 路由消息
    /// 性能:匹配速度慢于其他类型,较少使用
    /// </summary>
    Headers,
}

/// <summary>
/// Exchange 类型扩展方法
/// </summary>
public static class ExchangeTypeExtensions
{
    /// <summary>
    /// 转换为 RabbitMQ 的字符串表示
    /// </summary>
    public static string ToRabbitMQString(this ExchangeType exchangeType)
    {
        return exchangeType switch
        {
            ExchangeType.Direct => "direct",
            ExchangeType.Topic => "topic",
            ExchangeType.Fanout => "fanout",
            ExchangeType.Headers => "headers",
            _ => throw new ArgumentOutOfRangeException(nameof(exchangeType), exchangeType, null),
        };
    }

    /// <summary>
    /// 从字符串解析为枚举
    /// </summary>
    public static ExchangeType FromString(string exchangeType)
    {
        return exchangeType.ToLowerInvariant() switch
        {
            "direct" => ExchangeType.Direct,
            "topic" => ExchangeType.Topic,
            "fanout" => ExchangeType.Fanout,
            "headers" => ExchangeType.Headers,
            _ => throw new ArgumentException(
                $"未知的 Exchange 类型: {exchangeType}",
                nameof(exchangeType)
            ),
        };
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个定义 RabbitMQ Exchange 类型的 C# 代码文件,主要包含一个枚举类型和相应的扩展方法。让我详细解释一下:

代码结构分析

1. 命名空间

namespace Dpz.Core.MessageQueue.Enums;

属于 Dpz.Core.MessageQueue.Enums 命名空间,表明这是一个消息队列核心库中的枚举定义。

2. ExchangeType 枚举

这个枚举定义了 RabbitMQ 中四种主要的 Exchange 类型:

Direct(直接路由)

  • 工作原理:精确匹配路由键
  • 使用场景:点对点消息传递
  • 示例:订单系统中发送给特定用户的通知
  • 路由规则:routing key 必须完全匹配

Topic(主题路由)

  • 工作原理:支持通配符匹配
  • 通配符规则
    • *:匹配一个单词
    • #:匹配零个或多个单词
  • 使用场景:发布/订阅模式,灵活的消息分类
  • 示例:新闻系统按类别分发

Fanout(广播路由)

  • 工作原理:忽略路由键,广播到所有绑定队列
  • 使用场景:系统广播,如配置更新、缓存清除
  • 性能特点:最快的路由方式

Headers(头部路由)

  • 工作原理:根据消息头属性匹配
  • 匹配模式
    • x-match: all:所有属性匹配(AND 逻辑)
    • x-match: any:任一属性匹配(OR 逻辑)
  • 使用场景:复杂路由规则
  • 性能特点:匹配速度较慢

3. ExchangeTypeExtensions 扩展类

提供了两个实用的扩展方法:

ToRabbitMQString() 方法

public static string ToRabbitMQString(this ExchangeType exchangeType)
  • 功能:将枚举值转换为 RabbitMQ 识别的字符串格式
  • 实现:使用 switch 表达式进行映射
  • 返回值:对应的小写字符串("direct", "topic", "fanout", "headers")

FromString() 方法

public static ExchangeType FromString(string exchangeType)
  • 功能:从字符串解析回枚举值
  • 特点:不区分大小写(使用 ToLowerInvariant()
  • 异常处理:未知类型时抛出 ArgumentException

代码特点

  1. 详细的文档注释:每个枚举值都有完整的用途说明和示例
  2. 类型安全:使用枚举避免字符串硬编码
  3. 扩展性好:通过扩展方法提供转换功能
  4. 异常处理:对无效输入进行适当的异常处理
  5. 性能考虑:使用 switch 表达式提高性能

这个设计很好地封装了 RabbitMQ Exchange 类型的概念,为开发者提供了类型安全且易于使用的 API。

评论加载中...