Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core .Net核心日志依赖项注入-解析ILogger/ILogger`1-勾号是什么意思?解析类型是否可能?_Asp.net Core_Logging_.net Core_Dependency Injection_Ilogger - Fatal编程技术网

Asp.net core .Net核心日志依赖项注入-解析ILogger/ILogger`1-勾号是什么意思?解析类型是否可能?

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

我正在处理一个.NETCore3.1XUnit项目

我创建一个SerivCollection并调用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);
        }
[事实]
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(记录器);