C# DOTNET 依赖注入顺序澄清

问题描述 投票:0回答:1

在以下情况下我没有得到 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();
});

日志不再记录(到控制台)。为什么?

c# .net-core dependency-injection
1个回答
0
投票

我认为发生这种情况的原因如下:

AddAzureClientsCore 调用的

AddAzureClients
 尝试将 
NullLoggerFactory
注册为
ILoggerFactory
:

collection.TryAddSingleton<ILoggerFactory, NullLoggerFactory>();

虽然

AddLogging
尝试添加添加
LoggerFactory
作为一个:

services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());
仅当服务类型尚未注册时,

TryAdd{...}
方法才会添加注册,因此第一个调用的方法获胜(与
Add{...}
方法不同,后者将导致最后一个获胜)。

© www.soinside.com 2019 - 2024. All rights reserved.