Asp.net

如何從 ASP.NET Core 中的控制器以外的其他類登錄?

  • August 19, 2016

ASP.NET Core 具有對日誌記錄的內置支持,但文件指出應該通過請求ILogger通過依賴注入來完成日誌記錄,即將其作為參數添加到Controller建構子。

在我的程式碼中用參數污染方法簽名或構造ILogger函式感覺像是解決這個橫切關注點的錯誤解決方案。在 Android 中,Log該類是靜態的,因此可以輕鬆地從程式碼的任何部分進行日誌記錄。

從控制器以外的其他地方進行日誌記錄的好方法是什麼?

關於在任何組件中使用日誌記錄:

向應用程序中的組件添加日誌記錄是通過請求依賴注入ILoggerFactoryILogger<T>通過依賴注入來完成的。如果ILoggerFactory請求 an,則必須使用其CreateLogger方法創建記錄器。

如果你CustomClass是一個數據容器(DTO 類),它不應該知道日誌,而只是包含數據。

對於名稱為“Service”、“Provider”、“Handler”等的其他類,最佳實踐是使用依賴注入來解析實例。通常,您應該盡可能使用 DI,因為它是一種實現對象與其協作者或依賴項之間鬆散耦合的技術。有關更多資訊,以下問題可能很有趣:我應該使用依賴注入還是靜態工廠?

所以只需添加ILogger<CustomClass>到它的建構子(實際上與控制器相同),因為 .NET Core 預設只支持建構子注入:

public class CustomClass
{
   private readonly ILogger _logger;

   public CustomClass(ILogger<CustomClass> logger)
   {
       _logger = logger;
   }
}

ASP.NET Core 的內置依賴注入容器會自動解析瞬態依賴。因此,如果您的控制器將類A作為依賴項,該依賴項使用B您想要記錄某些內容的類,您的程式碼可以是這樣的:

public class MyController
{
   public MyController(ClassA classA)
   { ... }
}

public class ClassA
{
   public ClassA(ClassB classB)
   { ... }
}

public class ClassB
{
   private readonly ILogger _logger;

   public ClassB(ILogger<ClassB> logger)
   {
       _logger = logger;
   }

   public void DoSomethingWithLogging()
   {
       // use _logger
   }
}

請注意,您還需要在StartupusingIServiceCollection.Add…方法中註冊依賴項:

public void ConfigureServices(IServiceCollection services)
{
   // ...

   services.AddTransient<ClassB>();
   services.AddTransient<ClassA>();
}

內置日誌記錄支持意味著開箱即用的 .NET Core 知道並正在使用內置抽象來進行日誌記錄。這主要由 ILoggerFactoryILoggerProvider介面完成。

/// <summary>
/// Represents a type used to configure the logging system and create instances of <see cref="ILogger"/> from
/// the registered <see cref="ILoggerProvider"/>s.
/// </summary>
public interface ILoggerFactory : IDisposable

// <summary>
/// Represents a type that can create instances of <see cref="ILogger"/>.
/// </summary>
public interface ILoggerProvider : IDisposable

使用您自己的ILoggerProvider實現,您可以添加自己的記錄器,它可以做任何您想做的事情。您可以檢查NLog記錄器實現作為工作範例。

多虧了ILoggerFactory,您可以簡單地配置您的 Logger 以用於特定於項目的目的:

要在 ASP.NET Core 應用程序中配置日誌記錄,您應該ILoggerFactory在類的Configure方法中解析StartupILoggerFactoryASP.NET Core 會在你向方法中添加這種類型的參數時,自動提供一個使用依賴注入的實例Configure

引用自:https://stackoverflow.com/questions/39031585