[英]C# ASP.NET Core DI with logging
我正在為以下問題尋找 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);
});
在此示例中,Serilogs Sync 需要 CosmosFactory 提供的 CosmosClient 實例。 我能看到抓住它的唯一方法是執行以下操作:
builder.Services.BuildServiceProvider()
這並不理想,因為它可能會創建我的 singleton 服務的副本。
我不知道這是否是最好的方法。 但是玩弄它。 我發現最好的方法是將 ILoggerFactory 作為 singleton 注入並配置它。
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;
});
如果有人有更好的答案或原因,這不是一個好的答案。 請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.