[英]Using NLog during dependency injection
我有一個 class 是這樣的:
public class ABCHelper : ABCBase, IABCHelper
{
public ABCHelper()
: base(LogManager.GetCurrentClassLogger())
{
}
}
public class ABCBase : IABCBase
{
protected readonly Logger logger;
protected ABCBase(Logger logger)
{
this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public async Task<HttpResponseMessage> MakeAsyncCall(HttpRequestMessage request)
{
// some code
this.logger.Info("some string");
}
}
Class 在Unity注冊:
container.RegisterType<IABCHelper, ABCHelper>();
當我在某些代碼流中調用 MakeAsyncCall 時,NLog 將類名記錄為“ DynamicBuildPlanGenerationContext ”。
我期待的是“ABCHelper”而不是“DynamicBuildPlanGenerationContext”。
我錯過了什么?
首先,ABCHelper 是否是您當前的 class 有點值得商榷,因為它尚未構建;)
我認為 Unity 正在使用一些技巧來有效地構建依賴關系。 DynamicBuildPlanGenerationContext
的描述
這個 object 跟蹤構建計划生成的當前 state,積累 Microsoft 中間語言,為動態方法提供前導和后導,並跟蹤生成的 MSIL 中的局部變量之類的東西,以便它們可以跨 MSIL 生成策略重用。
NLog 嘗試通過檢查調用堆棧來找到當前的 class 名稱,但可能由於優化而找不到它。
我認為最簡單的解決方法是使用命名記錄器,例如使用LogManager.GetLogger(string)
public class ABCHelper : ABCBase, IABCHelper
{
public ABCHelper()
: base(LogManager.GetLogger(nameof(ABCHelper)))
{
}
}
旁注,也許是因為演示,但我在這里沒有看到正確注入的記錄器。 如果您不想將 DI 用於記錄器,您可以只創建一個 static 字段嗎?
如果您確實喜歡使用注入記錄器,那么我建議您使用NLog.Extensions.Logging檢查Microsoft.Extensions.Logging ,它也適用於 Unity 和 .NET Framework。 這可能也很有用: Resolve generic Microsoft.Extensions.Logging.ILogger<T> with Unity - get InvalidCastException
或者你可以使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.