首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实例化ServiceCollection并在.NET核心ConsoleApp中使用IHttpClientFactory?

如何实例化ServiceCollection并在.NET核心ConsoleApp中使用IHttpClientFactory?
EN

Stack Overflow用户
提问于 2022-04-05 08:58:19
回答 1查看 919关注 0票数 1

我有以下代码,在运行此代码时,当调用ConfigureService方法时,我可以验证是否在ConfigureServices方法中创建了客户机。

  1. 的主要问题:如何在MainAsync
  2. 优先级中访问clientFactory :如何通过构造函数实例化serviceColletion?

代码语言:javascript
运行
复制
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();
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-05 11:35:52

需要对此代码进行重构,以采用更多流内衬的方法应用依赖项注入。

代码语言:javascript
运行
复制
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();
    }
}

请注意,任何所需的服务现在都可以根据需要从服务提供者处解析和使用。

通过将主要功能封装在类中并从服务提供者解析它,可以进一步改进这一点,以便所有显式依赖项都可以由服务容器直接解析和注入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71748868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档