Asp.net core .Net核心日志依赖项注入-解析ILogger/ILogger`1-勾号是什么意思?解析类型是否可能?
我正在处理一个.NETCore3.1XUnit项目 我创建一个SerivCollection并调用AddLogging扩展方法。然后,我可以使用LoggerFactory/ILoggerFactory创建一个ILogger实例,当我调试时,我可以发现我的ServiceCollection具有此类型的ServiceDescriptor:Asp.net core .Net核心日志依赖项注入-解析ILogger/ILogger`1-勾号是什么意思?解析类型是否可能?,asp.net-core,logging,.net-core,dependency-injection,ilogger,Asp.net Core,Logging,.net Core,Dependency Injection,Ilogger,我正在处理一个.NETCore3.1XUnit项目 我创建一个SerivCollection并调用AddLogging扩展方法。然后,我可以使用LoggerFactory/ILoggerFactory创建一个ILogger实例,当我调试时,我可以发现我的ServiceCollection具有此类型的ServiceDescriptor: Lifetime = Singleton, ServiceType = {Name = "ILogger`1" FullName = "Microsoft.Ext
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);
}
[事实]
public void AddLogging\u RegistersILogger()
{
var services=new servicecolection().AddLogging();
var serviceProvider=services.BuildServiceProvider();
var logger1=serviceProvider.GetService();//记录器==null
尝试
{
var logger2=serviceProvider.GetService(typeof(ILogger));
}
捕获(例外e)
{
//无法将实现类型“Microsoft.Extensions.Logging.Logger`1[T]”转换为服务类型“Microsoft.Extensions.Logging.ILogger`1[TCategoryName]”
}
尝试
{
var loggerTypes=Assembly.GetAssembly(typeof(ILogger)).GetTypes(),其中(t=>t.Name==“ILogger`1”);
var loggerType=loggerTypes.First();
var logger3=serviceProvider.GetService(loggerType);
}
捕获(例外e)
{
//无法将实现类型“Microsoft.Extensions.Logging.Logger`1[T]”转换为服务类型“Microsoft.Extensions.Logging.ILogger`1[TCategoryName]”
}
var logger4=serviceProvider.GetService().CreateLogger();
Assert.NotNull(logger4);
}
在上的勾号“ILogger`1”
表示它是一种通用类型,即ILogger
您可以为任何泛型类型注入ILogger
。泛型类型用于以方便的方式设置类别名称,例如,ILogger
将具有“Microsoft.AspNetCore.Mvc.Controller”
类别名称
通常的做法是每个类都有一个带有类的类别名称的记录器,例如,一个名为MyService
的类将有一个记录器ILogger
您可以插入ILogger
或使用ILogger工厂
:
- 注入
ILogger
相当于调用loggerFactory.CreateLogger()
或loggerFactory.CreateLogger(“.MyService”)
通常与泛型类型关联我认为如果需要注入一些服务来解决问题,您也可以模拟记录器,如var logger=mock.Of();var someService=新的someService(记录器);