在以下情况下我没有得到 DI 的行为。
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using Microsoft.Extensions.Azure;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Azure.Identity;
namespace TestResults.Processor;
internal class Program
{
private static async Task Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", false, true)
.AddEnvironmentVariables()
.Build();
var services = new ServiceCollection();
services.AddLogging(configure =>
{
configure.AddConfiguration(configuration.GetSection("Logging"));
configure.AddConsole();
});
services.ConfigureAndInjectServices(configuration);
using var serviceProvider = services.BuildServiceProvider();
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogInformation($"serviceBusFqns: ....");
logger.LogInformation($"serviceBusFqns: ....");
}
}
public static class DependencyInjectionHelper
{
public static void ConfigureAndInjectServices(this IServiceCollection services, IConfigurationRoot configuration)
{
var serviceBusFqns = configuration.GetValue<string>("ServiceBus:FullyQualifiedNs");
var managedIdentityClientID = configuration.GetValue<string>("ServiceBus:ManagedIdentityClientID");
services.AddAzureClients(builder =>
{
builder.AddServiceBusClientWithNamespace(serviceBusFqns);
builder.UseCredential(new DefaultAzureCredential());
});
}
}
我可以看到控制台上生成的日志。但如果我交换这些行的顺序:
services.ConfigureAndInjectServices(configuration);
services.AddLogging(configure =>
{
configure.AddConfiguration(configuration.GetSection("Logging"));
configure.AddConsole();
});
日志不再记录(到控制台)。为什么?
我认为发生这种情况的原因如下:
由AddAzureClientsCore
调用的
AddAzureClients
尝试将 NullLoggerFactory
注册为 ILoggerFactory
:
collection.TryAddSingleton<ILoggerFactory, NullLoggerFactory>();
虽然
AddLogging
将尝试添加添加LoggerFactory
作为一个:
services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
仅当服务类型尚未注册时,TryAdd{...}
方法才会添加注册,因此第一个调用的方法获胜(与 Add{...}
方法不同,后者将导致最后一个获胜)。