如何使用内置的 ASP.Net 依赖项注入将类的类型注入到其依赖项之一中?
在 Startup.Configuration 中,我有:
services.AddTransient<ILogger>(x => new Logger(???));
我的类采用记录器实例
public class ExampleController : ControllerBase
{
public Example(ILogger logger)
{
...
}
}
记录器构造函数应该接收我写了"???"的typeof(示例),除了这应该适用于所有接收记录器的类。
这个问题与此非常相似,但我使用的是内部 ILogger 接口和记录器类,而不是使用 ninject。我实际上不想复制ninject的"上下文"。请求.ParentContext.Plan.Type"在另一个问题中。
我假设你使用的是Microsoft.Extensions.Logging
.至少有了这个,没有必要注册任何东西。日志记录已通过调用CreateDefaultBuilder()
Program.cs
进行设置。您最需要做的是添加备用/附加日志记录提供程序,但这是配置。你永远不会用ILogger
来称呼services.AddTransient
这样的东西。
相反,您可以通过用于注入它的参数来处理ILogger
接口的类型参数:
public class Example
{
public Example(ILogger<Example> logger)
{
...
}
}
您仍然可以将其存储在简单的ILogger
ivar 中,而无需泛型类型,但要注入的参数需要指定类型参数。
或者,如果您正在寻找更灵活的内容,则可以改为注入ILoggerFactory
,然后使用GetType()
提供类型:
public class Example
{
private readonly ILogger _logger;
public Example(ILoggerFactory loggerFactory)
{
_logger = _loggerFactory.CreateLogger(GetType())
}
}
可用的解决方案之一是:
初始化你的记录器(NLog,Log4Net,you-name-it),就像这样:
WebHost.ConfigureLogging((context, builder) => ...init your logger engine here...)
然后,使用 ILogger的通用版本<>而不仅仅是 ILogger 类型:
public class Example
{
public Example(ILogger<Example> logger)
{
...
}
}
希望这有帮助。