c# ASP.带日志的.NET Core DI



我正在寻找以下问题的DI解决方案。我正在编写一个自定义的SeriLog同步,需要依赖于我的服务提供商。我似乎不知道如何从services.AddLogging():

访问我的服务提供商。
services.AddSingleton<ICosmosFactory, CosmosFactory>();
services.AddLogging((builder) =>
{
var logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.AzureCosmosDB(
client: sp.Client,
databaseName: "MyDb",
collectionName: "logging",
timeToLive: TimeSpan.FromDays(7)
)
.CreateLogger();
builder.AddSerilog(logger);
});

在这个例子中,serilogssync需要一个由CosmosFactory提供的CosmosClient实例。我能看到抓取它的唯一方法是执行以下操作:

builder.Services.BuildServiceProvider()

这是不理想的,因为它可能会创建我的单例服务的副本。

我不知道这是否是最好的方法。而是在摆弄它。我发现最好的方法是将ILoggerFactory作为单例注入并配置它。

services.AddSingleton<ILoggerFactory>(sp =>
{
var factory = new LoggerFactory();
var logger = new LoggerConfiguration();
Serilog.Events.LogEventLevel level = Serilog.Events.LogEventLevel.Debug;
logger.WriteTo.AzureCosmosDB(
client:((ICosmosFactory)sp.GetRequiredService(typeof(ICosmosFactory))).Client,
databaseName: "Diagnostics",
collectionName: "logging",
timeToLive: TimeSpan.FromDays(logTTL),
restrictedToMinimumLevel: level
);
return factory;
});

如果有人有更好的答案或理由这不是一个好答案。请让我知道。

最新更新