簡體   English   中英

C# ASP.NET 帶日志記錄的核心 DI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM