在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();
}
}
核心特点:
- 每个配置方法(
ConfigureHostConfiguration
、ConfigureServices
等)均返回构建者实例(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
,后续配置(如ConfigureHttpClient
、AddHttpMessageHandler
)均基于构建者扩展,最终自动注册配置好的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 场景)
-
简化复杂对象配置
主机、HttpClient 等对象的配置涉及多维度(环境、服务、中间件等),构建者模式通过链式方法将配置拆分为独立步骤,降低认知复杂度。
-
灵活性与可扩展性
开发者可在默认配置基础上 "叠加" 自定义逻辑(如添加额外配置源、消息处理程序),无需修改框架底层代码(符合开放封闭原则)。
-
可读性与可维护性
链式调用使配置过程直观易懂(如
builder.ConfigureA().ConfigureB().Build()
),相比 "一次性传入大量参数" 的方式更易维护。 -
隔离构建与使用
构建者负责对象的创建细节,使用者只需关注 "配置什么",无需关心 "如何创建"(如
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"约定优于配置" 理念在设计模式层面的体现。