在 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/