首页 > 解决方案 > .Net Core Logging Dependency Injection - 解决 ILogger / ILogger`1 - 勾号是什么意思?解析类型可能吗?

问题描述

我正在使用 .Net Core 3.1 XUnit 项目。

我创建了一个 SerivceCollection 并调用 AddLogging 扩展方法。然后我可以使用 LoggerFactory / ILoggerFactory 创建一个 ILogger 实例,当我调试时,我的 ServiceCollection 可以为这种类型提供一个 ServiceDescriptor:

Lifetime = Singleton, ServiceType = {Name = "ILogger`1" FullName = "Microsoft.Extensions.Logging.ILogger`1"}, ImplementationType = {Name = "Logger`1" FullName = "Microsoft.Extensions.Logging.Logger`1"}

我很好奇该刻度线在类型名称中的含义以及是否可以在不使用 LoggerFactory 的情况下解析 ILogger 实例。

以下是解决 ILogger`1 的几次失败尝试。最后一次调用 CreateLogger 有效。

[Fact]
        public void AddLogging_RegistersILogger()
        {
            var services = new ServiceCollection().AddLogging();

            var serviceProvider = services.BuildServiceProvider();

            var logger1 = serviceProvider.GetService<ILogger>(); // logger == null

            try
            {
                var logger2 = serviceProvider.GetService(typeof(ILogger<>));
            }
            catch (Exception e)
            {
                // Implementation type 'Microsoft.Extensions.Logging.Logger`1[T]' can't be converted to service type 'Microsoft.Extensions.Logging.ILogger`1[TCategoryName]'
            }

            try
            {
                var loggerTypes = Assembly.GetAssembly(typeof(ILogger)).GetTypes().Where(t => t.Name == "ILogger`1");
                var loggerType = loggerTypes.First();
                var logger3 = serviceProvider.GetService(loggerType);
            }
            catch(Exception e)
            {
                // Implementation type 'Microsoft.Extensions.Logging.Logger`1[T]' can't be converted to service type 'Microsoft.Extensions.Logging.ILogger`1[TCategoryName]'
            }

            var logger4 = serviceProvider.GetService<ILoggerFactory>().CreateLogger<DependencyInjectionTests>();

            Assert.NotNull(logger4);
        }

标签: asp.net-corelogging.net-coredependency-injectionilogger

解决方案


打勾"ILogger`1"表示它是通用类型,即ILogger<CategoryName>

您可以为任何泛型类型注入ILogger<T>。泛型用于以方便的方式设置类别名称,例如ILogger<Controller>将具有"Microsoft.AspNetCore.Mvc.Controller"类别名称

通常的做法是每个类都有一个带有类名的记录器,例如,一个名为的类MyService将有一个记录器ILogger<MyService>

您可以注入ILogger<T>或使用ILoggerFactory

  • 注入ILogger<MyService>相当于调用loggerFactory.CreateLogger<MyService>()loggerFactory.CreateLogger("<namespace_of_my_service>.MyService")

推荐阅读