using Microsoft.Extensions.DependencyInjection;

namespace Dpz.Core.Service.Mediator;

/// <summary>
/// 提供 Mediator 相关的依赖注入扩展。
/// </summary>
public static class MediatorExtensions
{
    /// <summary>
    /// 注册 Dpz 中介者及治理管道。
    /// </summary>
    /// <param name="services">服务集合。</param>
    /// <returns>服务集合,便于链式调用。</returns>
    public static IServiceCollection AddDpzMediator(this IServiceCollection services)
    {
        services.AddMediator(options =>
        {
            options.ServiceLifetime = ServiceLifetime.Scoped;
        });

        return services.AddDpzMediatorGovernance();
    }

    /// <summary>
    /// 注册 Dpz 中介者治理管道(日志、耗时、异常包装)。
    /// </summary>
    /// <param name="services">服务集合。</param>
    /// <returns>服务集合,便于链式调用。</returns>
    public static IServiceCollection AddDpzMediatorGovernance(this IServiceCollection services)
    {
        services.AddScoped(
            typeof(IPipelineBehavior<,>),
            typeof(Common.Behaviors.MediatorLoggingBehavior<,>)
        );
        services.AddScoped(
            typeof(IPipelineBehavior<,>),
            typeof(Common.Behaviors.MediatorPerformanceBehavior<,>)
        );
        services.AddScoped(
            typeof(IPipelineBehavior<,>),
            typeof(Common.Behaviors.MediatorExceptionWrappingBehavior<,>)
        );
        return services;
    }

    /// <summary>
    /// 获取img标签图片地址
    /// </summary>
    /// <param name="elements"></param>
    /// <returns></returns>
    public static List<string> GetElementsImageUrls(this IHtmlCollection<IElement> elements)
    {
        return elements
            .Select(x => x.Attributes["src"])
            .Where(x => x != null)
            .Select(x => x!.Value)
            .Where(x => !string.IsNullOrEmpty(x))
            .ToList();
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这个代码文件定义了一个静态扩展类 MediatorExtensions,主要用于简化中介者模式(Mediator Pattern)相关的依赖注入配置。让我逐一解释每个方法的功能:

类概述

MediatorExtensions 是一个静态扩展类,为 IServiceCollection 提供扩展方法,用于注册中介者服务和相关的管道行为。

方法详解

1. AddDpzMediator 方法

public static IServiceCollection AddDpzMediator(this IServiceCollection services)

功能

  • 这是主要的注册方法,用于一次性配置完整的 Dpz 中介者服务
  • 首先调用 AddMediator 注册基础的中介者服务,并设置服务生命周期为 Scoped
  • 然后调用 AddDpzMediatorGovernance 注册治理管道
  • 返回服务集合以支持链式调用

2. AddDpzMediatorGovernance 方法

public static IServiceCollection AddDpzMediatorGovernance(this IServiceCollection services)

功能

  • 专门用于注册中介者的治理管道(管道行为)
  • 注册了三个核心的管道行为,都是以 Scoped 生命周期注册:
    • MediatorLoggingBehavior:日志记录行为
    • MediatorPerformanceBehavior:性能监控行为
    • MediatorExceptionWrappingBehavior:异常包装行为

这些管道行为实现了 IPipelineBehavior<,> 接口,会在中介者处理请求时按照注册顺序依次执行,形成一个处理管道。

3. GetElementsImageUrls 方法

public static List<string> GetElementsImageUrls(this IHtmlCollection<IElement> elements)

功能

  • 这个方法似乎与中介者模式无关,用于从HTML元素集合中提取图片URL
  • 遍历HTML元素集合,获取每个元素的 src 属性
  • 过滤掉空值,返回有效的图片URL列表

设计模式与架构

这个扩展类体现了以下设计原则:

  1. 扩展方法模式:为现有类型添加功能而不修改原类型
  2. 流畅接口:通过返回 IServiceCollection 支持链式调用
  3. 管道模式:通过多个 Behavior 形成处理管道
  4. 关注点分离:将日志、性能监控、异常处理等横切关注点分离到独立的行为中

使用示例

// 在 Startup.cs 或 Program.cs 中使用
services.AddDpzMediator();

// 或者只注册治理管道(如果已有其他中介者配置)
services.AddDpzMediatorGovernance();

注意GetElementsImageUrls 方法放在这个文件中可能不太合适,因为它与中介者功能无关,建议将其移动到更合适的扩展类中。

评论加载中...