簡體   English   中英

在依賴注入期間使用 NLog

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

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