我正在尝试将一些代码从 net core api 转换为类库。
我不知道如何使用 HttpClientfactory。 通常httpclientfactory可以在program.cs或Startup中配置
services.AddHttpClient("abc", xxx config).
如何在类库中为Httpclientfactory进行配置
在您的库中添加
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();
更新: 正如作者所描述的,他正在开发基于插件的应用程序。在这种情况下,您需要某种约定,例如:
Registration
的公共静态类,具有公共静态方法 Invoke(IServiceCollection sc, IConfiguration config)
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});
}
您可以尝试如下:
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的实例