Cle*_*ent 5 asp.net-core asp.net-core-2.0
在asp.net core 1.1中,我可以将IServiceProvider注入到记录程序提供程序中,并在CreateLogger调用记录程序时解析我的记录程序,但是在asp.net core 2.0中,这一切都发生了变化
我的ILogger实现需要注入依赖项。我该如何实现?
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)
| 归档时间: |
|
| 查看次数: |
1833 次 |
| 最近记录: |