我正在创建一个自定义的.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();