如何在asp.net core 2.0中将依赖项注入自定义ILogger中?

Cle*_*ent 5 asp.net-core asp.net-core-2.0

在asp.net core 1.1中,我可以将IServiceProvider注入到记录程序提供程序中,并在CreateLogger调用记录程序时解析我的记录程序,但是在asp.net core 2.0中,这一切都发生了变化

我的ILogger实现需要注入依赖项。我该如何实现?

Cod*_*ler 5

ASP.NET核心提供了可能性,以取代内置自定义一个DI容器(见文章详细信息)。您可以使用这种可能性来获取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;
    }

    //  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 但是我的问题是,在ConfigureServices之前调用ConfigureLogging,因此尚未注册依赖项。 (2认同)