我使用
ILoggingBuilder
和 ILoggerProvider
模式编写了一个自定义记录器,如 .net 文档中描述的
我的记录器需要在应用程序中构建服务,我能够使用
ServiceProvider
传递该服务,但不幸的是该实例是重复的(即使该服务被声明为单例)
这是代码示例:
return Host.CreateDefaultBuilder(args)
.ConfigureHostConfiguration(configurationBuilder =>
{
if (args is not null)
{
_ = configurationBuilder.AddCommandLine(args);
}
})
.ConfigureAppConfiguration((context, builder) =>
builder.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: true))
.ConfigureServices((hostContext, services) =>
{
services.AddServices();
serviceProvider = services.BuildServiceProvider();
}
)
.ConfigureLogging((hostContext, loggingFactory) =>
{
loggingFactory
.AddConsole()
.AddEventLog()
.AddFile("Logs/worker-{Date}.txt")
.AddCustomFormatter(serviceProvider.GetService<IMycustomService>());
});
我尝试了很多方法,但我无法在我的 servicesCollection 和自定义记录器中使用相同的实例
任何帮助将不胜感激
我假设在
AddCustomFormatter()
内部,您正在手动创建日志记录提供程序的实例,这就是您传递 IMyCustomService
已解析实例的原因。与其自己做,不如让 DI 帮你处理。像这样注册您的自定义记录器提供程序,将其添加到 ILoggerProvider
可用实现列表中:
public static ILoggingBuilder AddCustomFormatter(this ILoggingBuilder builder)
{
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, CustomLoggerProvider>());
return builder;
}
然后您的自定义记录器提供程序可以要求
IMyCustomService
,而无需显式提供其依赖项。
public class CustomLoggerProvider : ILoggerProvider
{
private readonly IMyCustomService myCustomService;
public CustomLoggerProvider(IMyCustomService myCustomService)
{
this.myCustomService = myCustomService;
}
public ILogger CreateLogger(string categoryName)
{
return new CustomLogger(myCustomService);
}
public void Dispose()
{
}
}