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

时间:2019-07-08 15:44:04

标签: c# asp.net-core dependency-injection

如何使用内置的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”。

2 个答案:

答案 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)
    {
        ...
    }
}

希望这会有所帮助。