我有以下代碼,當運行此代碼時,我可以驗證客戶端是在 ConfigureService 方法中創建的,當呼叫 ConfigureServices 時。
- 主要問題:如何在 MainAsync 任務中訪問 c??lientFactory?
- 次要優先級:如何通過建構式實體化 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 httpClientAt 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();
}
}
}
uj5u.com熱心網友回復:
此代碼需要重構以遵循更流線型的方法來應用依賴注入。
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://www.uj5u.com/yidong/456526.html
標籤:C# 网 asp.net-mvc 依赖注入 控制台应用程序
上一篇:有沒有辦法在視圖或cshtml檔案中注入配置設定(IConfiguration)?
下一篇:身份-如何重定向已登錄的用戶
