[英]How to use WinHttpHandler with IHttpClientFactory in core2.1?
[英]How to instantiate ServiceCollection and use IHttpClientFactory in a .NET Core ConsoleApp?
我有以下代碼,在運行此代碼時,我可以在調用 ConfigureServices 時驗證是否在 ConfigureService 方法中創建了客戶端。
namespace CustomeNameSpace
{
public class Program
{
public static IConfigurationRoot configuration;
private static readonly IServiceCollection serviceCollection;
public static void Main(string[] args)
{
ConfigureServices();
ILogger logger = NullLogger.Instance;
MainAsync(logger).GetAwaiter().GetResult();
}
private static async Task MainAsync(ILogger log)
{
// Need to use httpClient At this location....
// var clientFactory = .....
// var client = clientFactory.CreateClient()
}
public static void ConfigureServices()
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddHttpClient();
var clientFactory = serviceCollection.BuildServiceProvider().GetRequiredService<IHttpClientFactory>();
// var client = clientFactory.CreateClient();
configuration = new ConfigurationBuilder().SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
.AddJsonFile("local.settings.json", false)
.Build();
}
}
}
此代碼需要重構以遵循更多 stream 內襯方法來應用依賴注入。
public class Program {
//async Task Main feature allowed from C# 7.1+
public static async Task Main(string[] args) {
//Composition root
IServiceProvider services = ConfigureServices();
ILogger logger = NullLogger.Instance;
IHttpClientFactory clientFactory = service.GetRequiredService<IHttpClientFactory>();
HttpClient client = clientFactory.CreateClient();
IConfiguration configuration = service.GetRequiredService<IConfiguration>();
await RunAsync(logger, client, configuration);
}
private static async Task RunAsync(ILogger log, HttpClient client, IConfiguration configuration) {
//...
}
public static IServiceProvider ConfigureServices() {
IServiceCollection services = new ServiceCollection();
services.AddHttpClient();
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetParent(AppContext.BaseDirectory).FullName)
.AddJsonFile("local.settings.json", false)
.Build();
services.AddSingleton<IConfigurationRoot>(configuration);
services.AddSingleton<IConfiguration>(configuration);
return services.BuildServiceProvider();
}
}
請注意現在如何根據需要從服務提供商處解決和使用任何所需的服務。
這可以通過將主要功能封裝在 class 中並從服務提供者解析它來進一步改進,以便所有顯式依賴項都可以由服務容器直接解析和注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.