using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace Dpz.Core.Infrastructure.RateLimiting;

/// <summary>
/// 限流中间件与服务注册扩展
/// </summary>
public static class RateLimitMiddlewareExtensions
{
    /// <summary>
    /// 注册窗口期限流服务,绑定配置节 "RateLimit"
    /// 未配置时使用默认值
    /// </summary>
    public static IServiceCollection AddIpRateLimit(
        this IServiceCollection services,
        IConfiguration configuration,
        string sectionName = "RateLimit"
    )
    {
        var config = new RateLimitConfig();
        configuration.GetSection(sectionName).Bind(config);

        return AddIpRateLimit(services, config);
    }

    /// <summary>
    /// 注册窗口期限流服务,使用默认配置
    /// </summary>
    public static IServiceCollection AddIpRateLimit(this IServiceCollection services)
    {
        return AddIpRateLimit(services, new RateLimitConfig());
    }

    private static IServiceCollection AddIpRateLimit(
        IServiceCollection services,
        RateLimitConfig config
    )
    {
        services.AddSingleton(config);
        services.AddSingleton<IIpRateLimitService, IpRateLimitService>();

        return services;
    }

    /// <summary>
    /// 添加窗口期限流中间件
    /// 需先通过 AddIpRateLimit 注册服务
    /// </summary>
    public static IApplicationBuilder UseIpRateLimit(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RateLimitMiddleware>();
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个 ASP.NET Core 限流功能的扩展类,用于简化 IP 限流服务的注册和中间件的使用。

主要功能

1. 服务注册扩展方法

提供了三个重载方法来注册限流服务:

方法一:从配置文件读取配置

AddIpRateLimit(IServiceCollection services, IConfiguration configuration, string sectionName = "RateLimit")
  • appsettings.json 等配置文件中读取限流配置
  • 默认读取 "RateLimit" 配置节
  • 可自定义配置节名称

方法二:使用默认配置

AddIpRateLimit(IServiceCollection services)
  • 使用 RateLimitConfig 的默认值
  • 适用于快速启用限流功能的场景

私有核心方法

AddIpRateLimit(IServiceCollection services, RateLimitConfig config)
  • 实际执行服务注册的核心逻辑
  • 注册两个单例服务:
    • RateLimitConfig:限流配置对象
    • IIpRateLimitService:限流服务实现(IpRateLimitService

2. 中间件注册扩展方法

UseIpRateLimit(IApplicationBuilder builder)
  • RateLimitMiddleware 添加到 HTTP 请求管道
  • 必须先调用 AddIpRateLimit 注册服务

使用示例

Program.cs 中的典型用法

var builder = WebApplication.CreateBuilder(args);

// 方式1: 从配置文件读取
builder.Services.AddIpRateLimit(builder.Configuration);

// 方式2: 使用默认配置
builder.Services.AddIpRateLimit();

var app = builder.Build();

// 启用限流中间件
app.UseIpRateLimit();

app.Run();

配置文件示例 (appsettings.json)

{
  "RateLimit": {
    "MaxRequests": 100,
    "WindowSeconds": 60
  }
}

设计特点

  1. 链式调用:所有方法都返回原对象,支持流式 API 调用
  2. 单例模式:限流配置和服务使用单例生命周期,提高性能
  3. 配置灵活:支持配置文件、默认配置、自定义配置节
  4. 职责分离:配置、服务、中间件分离,符合单一职责原则

这是一个典型的 ASP.NET Core 扩展方法模式,用于简化依赖注入和中间件配置。

评论加载中...