我有以下代码,在运行此代码时,当调用ConfigureService方法时,我可以验证是否在ConfigureServices方法中创建了客户机。
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();
}
}
}发布于 2022-04-05 11:35:52
需要对此代码进行重构,以采用更多流内衬的方法应用依赖项注入。
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();
}
}请注意,任何所需的服务现在都可以根据需要从服务提供者处解析和使用。
通过将主要功能封装在类中并从服务提供者解析它,可以进一步改进这一点,以便所有显式依赖项都可以由服务容器直接解析和注入。
https://stackoverflow.com/questions/71748868
复制相似问题