c# - 如何将依赖项注入(inject) asp.net core 2.0 中的自定义 ILogger?

标签 c# asp.net-core asp.net-core-2.0

在 asp.net core 1.1 中,我可以将 IServiceProvider 注入(inject)记录器提供程序并在 CreateLogger 时解析我的记录器。被调用了,但在 asp.net core 2.0 中这一切都改变了

我的 ILogger 实现需要注入(inject)依赖项。
我怎样才能做到这一点?

最佳答案

ASP.NET 核心提供了用自定义容器替换内置 DI 容器的可能性(详见 this 文章)。您可以使用这种可能性来获取 IServiceProvider 的实例早期用于在仍使用标准 .Net 核心 DI 容器的同时记录引导。

为此,您应该更改 Startup.ConfigureServices(IServiceCollection services) 的返回值从 void 到 IServiceProvider 的方法.您可以使用这种可能性在 ConfigureServices 中构建 IServiceProvider 的实例,将其用于记录引导,然后从该方法返回。

示例代码:

public interface ISomeDependency
{
}

public class SomeDependency : ISomeDependency
{
}

public class CustomLogger : ILogger
{
    public CustomLogger(ISomeDependency dependency)
    {
    }

    //  ...
}

public class CustomLoggerProvider : ILoggerProvider
{
    private readonly IServiceProvider serviceProvider;

    public CustomLoggerProvider(IServiceProvider serviceProvider)
    {
        this.serviceProvider = serviceProvider;
    }

    public ILogger CreateLogger(string categoryName)
    {
        return serviceProvider.GetRequiredService<ILogger>();
    }

    //  ...
}

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        return ConfigureLogging(services);
    }

    private IServiceProvider ConfigureLogging(IServiceCollection services)
    {
        services.AddTransient<ISomeDependency, SomeDependency>();
        services.AddSingleton<ILogger, CustomLogger>();
        IServiceProvider serviceProvider = services.BuildServiceProvider();

        var loggerFactory = new LoggerFactory();
        loggerFactory.AddProvider(new CustomLoggerProvider(serviceProvider));

        return serviceProvider;
    }

    //  ...
}

关于c# - 如何将依赖项注入(inject) asp.net core 2.0 中的自定义 ILogger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47299731/

相关文章:

c# - 如何在 Controller 操作中访问 $orderBy 等查询参数?

c# - Httpclient 该实例已启动一个或多个请求。属性只能在发送第一个请求之前修改

ninject - 如何将 Ninject 集成到 ASP.NET Core 2.0 Web 应用程序中?

asp.net-core-mvc - 检索 ASP Net Core 2.0 MVC 中的应用程序版本

c# - 返回实现类类型的接口(interface)函数

c# - 从网页运行exe

c# - ASP.NET Core 控件条件验证

asp.net-core - 如何在aspnet核心应用程序中为静态文件使用多个目录?

c# - 包含非 null 元素的列表最终包含 null。同步问题?

c# - 在 C# 中,+= 和 =+ 之间有什么区别吗?