gpt4 book ai didi

c# - Netcore - 将配置应用于框架类

转载 作者:行者123 更新时间:2023-11-30 23:07:44 26 4
gpt4 key购买 nike

我有一组库,我想将其从 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# - Netcore - 将配置应用于框架类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com