在核心依赖项注入期间获取实现类型 ASP.Net



如何使用内置的 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)
{
...
}
}

您仍然可以将其存储在简单的ILoggerivar 中,而无需泛型类型,但要注入的参数需要指定类型参数。

或者,如果您正在寻找更灵活的内容,则可以改为注入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)
{
...
}
}

希望这有帮助。

最新更新