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

标签 c# dependency-injection asp.net-core configuration .net-core

我有一组库,我想将其从 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/

相关文章:

c# - 如何在复杂的 simpleDb 实体上实现 CRUD

c# - 在 asp.net core 中创建作用域工厂

asp.net-core - NavLink 更新 URL 但不会在 Blazor 中重新加载页面

c# - 如何在 ASP.NET 5 中序列化 Rsa 签名凭据?

c# - 在表中插入数据之前是否可以获取 Id (IDENTITY) 的新值?

c# - 模拟 protected 方法总是返回 true

java - OSGi 中的声明式服务与蓝图服务

asp.net-core - 当我在浏览器中刷新页面时,如何在 ASP.NET Core 2.2 中启用自动重建?

c# - 通过 Selenium Webdriver 包含的文本选择一个元素

java - Junit 4 Spring - 无法加载 ApplicationContext