【发布时间】:2018-12-02 03:21:40
【问题描述】:
我正在创建一个自定义 .NET Core ILoggerProvider,它需要将一些依赖项传递到其构造函数中。
我相信我正在使用一种相当常见的模式来初始化我的日志记录实现;它看起来像这样:
var services = new ServiceCollection();
// Register some services here
services.AddLogging(builder =>
{
builder.AddProvider(new DebugLoggerProvider());
});
var provider = services.BuildServiceProvider();
我想在 AddLogging 块中添加我的新提供程序,就像当前添加 DebugLoggerProvider 一样。
我的自定义提供程序需要将一些其他服务传递到其构造函数中,并且由于这些服务已经在ServiceCollection 中注册,我假设我应该能够引用它们。但是,与 AddSingleton 等方法不同,这些方法具有暴露 IServiceProvider 的重载,AddLogging 似乎没有提供等效项。
有没有一种简单的方法来实现这一点,或者我是否试图做一些与 .NET Core 日志记录的设计方式相矛盾的事情?
更新:
在尝试了@Nkosi 提出的建议后,我可以确认可以通过绕过AddLogging 并直接在内部实现它的功能来使其工作,如下所示:
var services = new ServiceCollection();
// Register some services
services.AddSingleton<IMyService, MyService>();
// Initialize logging
services.AddOptions();
services.AddSingleton<ILoggerFactory, LoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
services.AddSingleton<ILoggerProvider>(p => new DebugLoggerProvider());
services.AddSingleton<ILoggerProvider>(p => new MyLoggerProvider("Constant value", p.GetService<IMyService>()));
var provider = services.BuildServiceProvider();
【问题讨论】:
标签: c# logging dependency-injection .net-core .net-core-2.0