c# - 如何在 .NET Core ConsoleApp 中实例化 ServiceCollection 并使用 IHttpClientFactory?

标签 c# asp.net asp.net-mvc dependency-injection console-application

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

  1. 主要问题:如何在 MainAsync 任务中访问 c​​lientFactory?
  2. 次要优先级:如何通过构造函数实例化 serviceCollection?
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();
        }
    }
}

最佳答案

需要重构此代码,以遵循更精简的方法来应用依赖项注入(inject)。

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();
    }
}

请注意现在如何根据服务提供商的需要解析和使用任何所需的服务。

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

关于c# - 如何在 .NET Core ConsoleApp 中实例化 ServiceCollection 并使用 IHttpClientFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71748868/

相关文章:

c# - 调用 ashx 处理程序后关闭浏览器中的选项卡

c# - 使用 jQuery 日期选择器和创建 View 无法正常工作

asp.net-mvc - Asp.Net MVC 4 模型

c# - 尽管安装了 Microsoft.ACE.OLEDB.12.0,但“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册

c# - 如何使用 iTextSharp for C# 设置现有 PDF 的版权元数据

c# - 如何转换 System.IO.Stream 中的 System.Byte[]?

asp.net - 正则表达式负向前瞻

asp.net - CSS折叠/隐藏<span>中没有数据的div

c# - 我可以在 C# 库中有全局预处理器定义吗?

c# - Owin Authentication and claims in asp.net 如何访问用户数据