asp.net-core - .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);
}
解决方案
打勾"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")
推荐阅读
- android - 如何通过有选择地捆绑依赖库来生成多风味的 apk?
- angular - Angular 9 中的离线生产构建
- javascript - Chrome 扩展 - 在 Window 和/或 iFrame 中启动
- python - 如何从 Windows 注册表中解码 REG_BINARY?
- angular - ng serve 后无法解析 NgxGalleryPreviewComponent 的所有参数
- python - Python,如果 Windows10 文件夹包含超过 10000 个文件,则删除最旧的 2000 个文件
- android - 无法获取提供者 androidx.lifecycle.ProcessLifecycleOwnerInitializer
- processing - 有没有办法将线从一个地方随机移动到另一个地方?
- python - 为什么同一图像的 base64encoded 输出不同?
- node.js - 在方法调用上创建新的 this