如何正确创建带配置选项的Refit HttpClient中间件扩展?
如何正确创建带配置选项的Refit HttpClient中间件扩展?
嘿,这个需求其实很好实现,只需要在你的扩展方法里先把配置选项解析出来,再把它用到HttpClient的BaseAddress配置里就行。我给你调整一下代码,你看看:
首先是你的ServerOptions类不用改,然后修改AddServers扩展方法:
public class ServerOptions { public string MyServerUrl { get; set; } } public static IServiceCollection AddServers(this IServiceCollection services, Action<ServerOptions> configureOptions = null) { // 如果没有传入配置委托,直接返回原服务集合 if (configureOptions is null) return services; // 实例化配置选项对象,并用用户传入的委托填充属性 var serverOptions = new ServerOptions(); configureOptions(serverOptions); // 可选:把配置选项注册到DI容器里,方便其他服务后续注入使用 services.AddSingleton(serverOptions); // 做个简单的校验,避免空地址导致Uri创建失败 if (string.IsNullOrWhiteSpace(serverOptions.MyServerUrl)) { throw new ArgumentException("请在配置选项中设置有效的MyServerUrl地址,不能为空或空白"); } // 注册HttpClient和Refit客户端,这里直接用配置好的MyServerUrl设置BaseAddress services.AddHttpClient(); services.AddRefitClient<IMyServerService>(new RefitSettings(new NewtonsoftJsonContentSerializer())) .AddHttpMessageHandler<MyServerHandler>() .ConfigureHttpClient(client => client.BaseAddress = new Uri(serverOptions.MyServerUrl)); return services; }
关键步骤说明:
- 我们先手动实例化了
ServerOptions,然后调用用户传入的configureOptions委托,这样就能拿到用户设置的MyServerUrl了 - 加了一个空值校验,防止用户漏填地址导致后续创建
Uri时抛出莫名其妙的异常,调试起来更省心 - 可选的把配置选项注册到DI容器,要是其他服务需要用到这些服务器配置,直接注入
ServerOptions就能用,不用再重复读取配置 - 最后在
ConfigureHttpClient里直接用serverOptions.MyServerUrl给BaseAddress赋值就搞定了
调用方式和你预想的完全一样:
services.AddServers(options => { options.MyServerUrl = configuration["App:MyServerUrl"]; });
另外提个小建议:最好确保MyServerUrl是标准的Uri格式(比如带http://或https://),不然创建Uri对象时还是会报错哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

