簡體   English   中英

如何實例化 ServiceCollection 並在 .NET Core ConsoleApp 中使用 IHttpClientFactory?

[英]How to instantiate ServiceCollection and use IHttpClientFactory in a .NET Core ConsoleApp?

我有以下代碼,在運行此代碼時,我可以在調用 ConfigureServices 時驗證是否在 ConfigureService 方法中創建了客戶端。

  1. 主要問題:如何在 MainAsync 任務中訪問 clientFactory?
  2. 次要優先級:如何通過構造函數實例化 serviceColletion?
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM