使用服务的自定义记录器需要相同的实例

问题描述 投票:0回答:1

我使用

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 和自定义记录器中使用相同的实例

任何帮助将不胜感激

c# .net dependency-injection .net-6.0 iloggerfactory
1个回答
0
投票

我假设在

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()
    {
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.