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