在下面的 case 中,我不理解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());
        });

    }
}

我可以看到控制台上生成的日志(log).但如果我调换这些行的顺序:

services.ConfigureAndInjectServices(configuration);

services.AddLogging(configure =>
{
    configure.AddConfiguration(configuration.GetSection("Logging"));
    configure.AddConsole();
});

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

推荐答案

我认为这是由以下几个原因造成的:

AddAzureClients调用的AddAzureClientsCoretry 将NullLoggerFactory注册为ILoggerFactory:

collection.TryAddSingleton<ILoggerFactory, NullLoggerFactory>();

AddLoggingtry to add LoggerFactory作为一个整体:

services.TryAdd(ServiceDescriptor.Singleton<ILoggerFactory, LoggerFactory>());

仅当服务类型尚未注册时,TryAdd{...}个方法才会添加注册,因此第一个称为WINS的方法(与将导致最后一个的Add{...}个方法不同).

Csharp相关问答推荐

C#将参数传递给具有变化引用的变量

实体框架核心上是否支持使用NPGSQL的字符串聚合?

WPF DataGrid中的三维数据

将轮询与超时同步

应用程序重新启动后,EFCore列表的BSON反序列化错误

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

用C#从Word文档中删除重复的节控件和文本内容控件

使用C#和.NET 7.0无法访问Cookie中的数据

C#LINQ子字符串

Content WithTargetPath实际上是有效的MSBuild项吗?

获取混淆&Quot;模糊引用&Quot;错误

为什么我的用户界面对象移动到略低于实际目标?

我可以强制System.Text.Json.JsonSerializer以非递归方式工作吗?

毛伊岛.NET 8图片不再适合按钮

在ObservableCollection上使用[NotifyPropertyChangedFor()]源代码生成器不会更新UI

将列表转换为带有逗号分隔字符串形式的值的字典

.NET EF Core Automapper项目到筛选不起作用

如何为控制器PUT操作绑定对象数组

Unity 3D-意外轴捕捉和未知力对脉冲react 行为的影响

如何查找Span;T&>是否包含相同顺序的其他Span<;T&>