ASP.NET Core 中的构建者模式

ASP.NET Core 中,构建者模式(Builder Pattern)是一种广泛应用的创建型设计模式,其核心思想是将复杂对象的构建过程与表示分离 ,通过分步配置的方式创建对象,使得相同的构建过程可以生成不同的结果。这种模式在ASP.NET Core 的框架设计中占据重要地位,尤其在处理复杂配置(如主机配置、服务注册、HTTP 客户端配置等)时表现突出。

一、ASP.NET Core 中构建者模式的核心应用场景

ASP.NET Core 框架大量使用构建者模式处理 "复杂对象的分步配置",典型场景包括:

1. 主机构建(IHostBuilder / IWebHostBuilder

主机(Host)是ASP.NET Core 应用的运行容器,负责管理应用生命周期、配置、服务等核心组件。构建主机是一个复杂过程(需配置环境、配置文件、服务、中间件等),因此框架通过IHostBuilder(通用主机)和IWebHostBuilder(Web 主机)实现构建者模式。

示例:Web 主机构建

csharp

复制代码
public class Program
{
    public static void Main(string[] args)
    {
        // 构建Web主机(链式配置,每步返回构建者自身)
        var host = WebApplication.CreateBuilder(args)
            // 配置主机(如环境、配置源)
            .ConfigureHostConfiguration(config =>
            {
                config.AddJsonFile("hostsettings.json", optional: true);
            })
            // 配置应用配置(如appsettings.json)
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
                config.AddEnvironmentVariables();
            })
            // 配置服务(依赖注入)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddControllers();
                services.AddScoped<IMyService, MyService>();
            })
            // 构建主机
            .Build();

        // 运行应用
        host.Run();
    }
}

核心特点

  • 每个配置方法(ConfigureHostConfigurationConfigureServices等)均返回构建者实例(IWebHostBuilder),支持链式调用。
  • 开发者可按需 "叠加" 配置(如默认配置基础上添加自定义配置),无需关心底层构建细节。

2. HTTP 客户端配置(IHttpClientBuilder

HttpClient的配置涉及基地址、超时时间、消息处理程序、拦截器等复杂选项,ASP.NET Core 通过IHttpClientBuilder实现构建者模式,简化配置过程。

示例:配置 HttpClient

csharp

复制代码
public void ConfigureServices(IServiceCollection services)
{
    // 创建HttpClient构建者,链式配置
    services.AddHttpClient("MyApiClient")
        // 配置基地址
        .ConfigureHttpClient(client =>
        {
            client.BaseAddress = new Uri("https://api.example.com/");
            client.Timeout = TimeSpan.FromSeconds(30);
        })
        // 添加消息处理程序(如日志、重试)
        .AddHttpMessageHandler<LoggingHandler>()
        .AddPolicyHandler(GetRetryPolicy()); // 集成Polly重试策略
}

// 定义重试策略
private IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
}

核心特点

  • 通过AddHttpClient获取IHttpClientBuilder,后续配置(如ConfigureHttpClientAddHttpMessageHandler)均基于构建者扩展,最终自动注册配置好的HttpClient到 DI 容器。

3. 选项配置(IOptionsBuilder

ASP.NET Core 的选项模式(Options Pattern)中,IOptionsBuilder用于分步配置选项验证、命名选项等,也是构建者模式的典型应用。

示例:配置带验证的选项

csharp

复制代码
public void ConfigureServices(IServiceCollection services)
{
    // 配置选项并启用验证
    services.AddOptions<MyOptions>()
        .BindConfiguration("MyOptions") // 绑定配置节点
        .ValidateDataAnnotations() // 启用数据注解验证
        .Validate(option => option.MaxCount > 0, "MaxCount必须大于0") // 自定义验证
        .ValidateOnStart(); // 启动时验证(而非首次使用时)
}

public class MyOptions
{
    [Required]
    public string ApiKey { get; set; }
    
    public int MaxCount { get; set; }
}

二、构建者模式的优势(结合ASP.NET Core 场景)

  1. 简化复杂对象配置

    主机、HttpClient 等对象的配置涉及多维度(环境、服务、中间件等),构建者模式通过链式方法将配置拆分为独立步骤,降低认知复杂度。

  2. 灵活性与可扩展性

    开发者可在默认配置基础上 "叠加" 自定义逻辑(如添加额外配置源、消息处理程序),无需修改框架底层代码(符合开放封闭原则)。

  3. 可读性与可维护性

    链式调用使配置过程直观易懂(如builder.ConfigureA().ConfigureB().Build()),相比 "一次性传入大量参数" 的方式更易维护。

  4. 隔离构建与使用

    构建者负责对象的创建细节,使用者只需关注 "配置什么",无需关心 "如何创建"(如IHostBuilder.Build()内部处理主机初始化细节)。

三、自定义构建者模式实现(原理示例)

理解ASP.NET Core 框架中的构建者模式后,可尝试自定义构建者类,模拟框架设计思路。

示例:自定义一个 "订单构建者"

csharp

复制代码
// 复杂对象:订单
public class Order
{
    public string ProductName { get; set; }
    public int Quantity { get; set; }
    public decimal Price { get; set; }
    public bool IsVip { get; set; }
    public decimal TotalPrice { get; private set; }

    public void CalculateTotal()
    {
        TotalPrice = Price * Quantity;
        if (IsVip) TotalPrice *= 0.9m; // VIP打9折
    }
}

// 构建者接口
public interface IOrderBuilder
{
    IOrderBuilder SetProduct(string name, decimal price);
    IOrderBuilder SetQuantity(int quantity);
    IOrderBuilder SetVip(bool isVip);
    Order Build();
}

// 构建者实现
public class OrderBuilder : IOrderBuilder
{
    private readonly Order _order = new Order();

    public IOrderBuilder SetProduct(string name, decimal price)
    {
        _order.ProductName = name;
        _order.Price = price;
        return this; // 返回自身,支持链式调用
    }

    public IOrderBuilder SetQuantity(int quantity)
    {
        _order.Quantity = quantity;
        return this;
    }

    public IOrderBuilder SetVip(bool isVip)
    {
        _order.IsVip = isVip;
        return this;
    }

    public Order Build()
    {
        _order.CalculateTotal(); // 构建最终对象前的计算
        return _order;
    }
}

// 使用构建者
public class OrderService
{
    public Order CreateVipOrder()
    {
        return new OrderBuilder()
            .SetProduct("笔记本电脑", 5000m)
            .SetQuantity(1)
            .SetVip(true)
            .Build();
    }
}

总结

构建者模式是ASP.NET Core 框架设计的核心模式之一,其思想贯穿于主机配置、服务注册、HTTP 客户端等关键组件中。掌握这一模式不仅能更好地理解框架底层逻辑,还能在自定义复杂对象配置时(如业务中的订单、报表生成等)设计出更灵活、可维护的代码。

核心要点:分步配置、链式调用、构建与表示分离 ,这也是ASP.NET Core"约定优于配置" 理念在设计模式层面的体现。

相关推荐
jiayi6 小时前
从 0 到 1 带你打造一个工业级 TypeScript 状态机
前端·设计模式·状态机
yw00yw7 小时前
常见的设计模式
开发语言·javascript·设计模式
我们从未走散7 小时前
设计模式学习笔记-----抽象责任链模式
java·笔记·学习·设计模式·责任链模式
别再问我单例了9 小时前
01-设计模式系列之---七大原则助你高效开发(完整版)
设计模式
哆啦code梦9 小时前
设计模式之命令模式
设计模式·命令模式
快乐的划水a10 小时前
中介者模式及优化
c++·设计模式·中介者模式
pengzhuofan11 小时前
Java设计模式-代理模式
java·设计模式·代理模式
郝学胜-神的一滴1 天前
C++ Core Guidelines 核心理念
开发语言·c++·设计模式·代码规范
西红柿维生素1 天前
设计模式之责任链模式
设计模式·责任链模式