如何從 ASP.NET Core 中的控制器以外的其他類登錄?
ASP.NET Core 具有對日誌記錄的內置支持,但文件指出應該通過請求
ILogger通過依賴注入來完成日誌記錄,即將其作為參數添加到Controller建構子。在我的程式碼中用參數污染方法簽名或構造
ILogger函式感覺像是解決這個橫切關注點的錯誤解決方案。在 Android 中,Log該類是靜態的,因此可以輕鬆地從程式碼的任何部分進行日誌記錄。從控制器以外的其他地方進行日誌記錄的好方法是什麼?
關於在任何組件中使用日誌記錄:
向應用程序中的組件添加日誌記錄是通過請求依賴注入
ILoggerFactory或ILogger<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 知道並正在使用內置抽象來進行日誌記錄。這主要由
ILoggerFactory和ILoggerProvider介面完成。/// <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方法中解析Startup。ILoggerFactoryASP.NET Core 會在你向方法中添加這種類型的參數時,自動提供一個使用依賴注入的實例Configure。