我有一组库,我想将其从 PCL 移动到 netcore。通过此举,我想简化 DI 系统并更新一些内部运作。
我想添加的一件事是内部对象的配置,就像在 Asp.Net Core 中一样(即 services.AddMvc(opt => {/* Options Stuff*/});
)。
我当前的服务集合扩展如下所示:
public static IServiceCollection AddCore(this IServiceCollectionserviceCollection, Action<HttpClientOptions> options)
{
serviceCollection.AddSingleton<HttpClient>();
serviceCollection.Configure(options);
return serviceCollection;
}
配置类如下所示:
public sealed class HttpClientOptions
{
public HttpMessageHandler MessageHandler { get; set; }
// Remaining properties omitted for brevity
}
但是我问自己,如何将配置应用于 HttpClient
,因为它是一个框架类,我无法修改它以通过构造函数注入(inject)获取选项。
有没有办法设置这个,或者我是否必须重新考虑我的配置方法?
最佳答案
serviceCollection.AddSingleton()
有一个重载,需要 Func<IServiceProvider, HttpClient>
工厂。
因此,您可能会做以下事情:
serviceCollection
.AddSingleton<HttpClient>((serviceCollectionInstance) => {
var myOptions = serviceCollectionInstance.GetRequiredService<MyHttpClientOptions>();
return new HttpClient(myOptions);
});
甚至
serviceCollection.AddSingleton<MyHttpClientFactory>(); // <-- your very own factory class that creates arbitrarily complex options
serviceCollection.AddSingleton<HttpClient>(_ => _.GetRequiredService<MyHttpClientFactory>().CreateHttpClient());
如果你真的想做得太过分,你甚至可以编写自己的扩展方法来实现流畅的配置风格:
public static class ServiceCollectionExtensions
{
public static void AddHttpClient(this IServiceCollection @this, Action<HttpClientOptions> configure = null)
{
var options = new HttpClientOptions();
if (configure != null)
{
configure(options);
}
@this.AddSingleton<HttpClient>(options);
}
}
用法:
serviceCollection.AddHttpClient(opts => {
opts.HttpMessageHandler = // etc
});
关于c# - Net Core - 将配置应用于框架类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045452/