【问题标题】:Get implementing type during ASP.Net core dependency injection在 ASP.Net 核心依赖注入期间获取实现类型
【发布时间】:2019-07-08 15:44:04
【问题描述】:

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

【问题讨论】:

  • 您使用的是哪个记录器,以及上面的示例是什么?因为 Example : Controller 与 Example 使用内置 DI Container for Core 的工作方式非常不同。
  • 我已更新我的代码和问题以澄清。是的,这个类应该是一个控制器。记录器不是 Microsoft.Extensions.Logging。
  • Serilog 是偶然的吗?

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


【解决方案1】:

我假设您使用的是Microsoft.Extensions.Logging。至少,没有必要注册任何东西。已经通过在Program.cs 中调用CreateDefaultBuilder() 设置了日志记录。您需要做的最多的是添加备用/附加日志记录提供程序,但这是配置。你永远不会用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())
    }
}

【讨论】:

  • 嘿,实际上我们使用的是内部 ILogger 和包装第三方记录器的记录器。
【解决方案2】:

一个可用的解决方案是:

像这样初始化您的记录器(NLog、Log4Net、you-name-it):

WebHost.ConfigureLogging((context, builder) => ...init your logger engine here...)

然后,使用 ILogger 的通用版本,而不仅仅是 ILogger 类型:

public class Example
{
    public Example(ILogger<Example> logger)
    {
        ...
    }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-01-03
    • 2018-12-24
    • 2019-06-07
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多