如何在类库中使用IHttpClientFactory

问题描述 投票:0回答:2

我正在尝试将一些代码从 net core api 转换为类库。

我不知道如何使用 HttpClientfactory。 通常httpclientfactory可以在program.cs或Startup中配置

services.AddHttpClient("abc", xxx config). 

如何在类库中为Httpclientfactory进行配置

c# asp.net-core httpclient mef httpclientfactory
2个回答
2
投票

在您的库中添加

IServiceCollection
的扩展方法以在主项目中“启用”它。

在图书馆:

public static class ServiceCollectionExt
{
    public static void AddYourStaff(this IServiceCollection services)
    {
        services.AddHttpClient("xxx", client =>
        {
            //your staff here
        });
        services.AddSingleton<ISomethingElse, SomethingElse>();
    }
} 

然后在你的

Startup
中调用它:

services.AddYourStaff();

更新: 正如作者所描述的,他正在开发基于插件的应用程序。在这种情况下,您需要某种约定,例如:

  1. 每个插件库必须有一个名为
    Registration
    的公共静态类,具有公共静态方法
    Invoke(IServiceCollection sc, IConfiguration config)
  2. 然后在您的
    Startup
    中,您可以迭代所有插件库并使用反射调用它们的
    Registration.Invoke(sc, config)
foreach(var pluginAssembly in plugins)
{
    pluginAssembly
        .GetType("Registration")
        .GetMethod("Invoke", BindingFlags.Public | BindingFlags.Static)
        .Invoke(null, new object[] {services, Configuration});
}

1
投票

您可以尝试如下:

public class HttpClientUtil
    {
        private static IServiceProvider serviceProvider { get; set; } 

        public static void Initial(IServiceProvider Provider)
        {
            if (Provider == null)
            {
                IHostBuilder builder = Host.CreateDefaultBuilder();
                builder.ConfigureServices(services =>
                {
                    services.AddHttpClient("client_1", config =>
                    {
                        config.BaseAddress = new Uri("http://client_1.com");
                        config.DefaultRequestHeaders.Add("header_1", "header_1");
                    });
                    services.AddHttpClient("client_2", config =>
                    {
                        config.BaseAddress = new Uri("http://client_2.com");
                        config.DefaultRequestHeaders.Add("header_2", "header_2");
                    });
                });
                serviceProvider = builder.Build().Services;
            }
            else
            {
                serviceProvider = Provider;
            } 
        }

        public static IHttpClientFactory GetHttpClientFactory()
        {
            if(serviceProvider==null)
            {
                Initial(serviceProvider);
            }
            return (IHttpClientFactory)serviceProvider.GetServices<IHttpClientFactory>();
        }

    }

可以通过接口获取httpclinetfactory的实例

© www.soinside.com 2019 - 2024. All rights reserved.