首页 > 解决方案 > 在依赖注入期间使用 NLog

问题描述

我有一堂这样的课:

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");
        }
}   

Unity 中的类注册:

container.RegisterType<IABCHelper, ABCHelper>();

当我在某些代码流中调用 MakeAsyncCall 时,NLog 将类名记录为“ DynamicBuildPlanGenerationContext ”。

我期待“ABCHelper”而不是“DynamicBuildPlanGenerationContext”。

我错过了什么?

标签: c#unity-containernlog

解决方案


首先,如果 ABCHelper 是您当前的课程,这有点值得商榷,因为它尚未构建;)

我认为 Unity 正在使用一些技巧来有效地构建依赖项。的描述DynamicBuildPlanGenerationContext

该对象跟踪构建计划生成的当前状态,积累 Microsoft 中间语言,为动态方法提供前导和后导,并跟踪生成的 MSIL 中的局部变量等内容,以便它们可以跨 MSIL 生成策略重用。

NLog 尝试通过检查调用堆栈来查找当前类名,但可能由于优化而无法找到它。

我认为最简单的解决方法是使用命名记录器,例如使用LogManager.GetLogger(string)

public class ABCHelper : ABCBase, IABCHelper
{
    public ABCHelper()
        : base(LogManager.GetLogger(nameof(ABCHelper)))
    {
    }
}

旁注,也许是因为演示,但我在这里看不到记录器正确注入。如果您不想将 DI 用于记录器,您可以创建一个静态字段吗?

如果您确实喜欢使用注入的记录器,那么我建议您使用NLog.Extensions.Logging检查Microsoft.Extensions.Logging ,它也适用于 Unity 和 .NET Framework。这可能也很有用:Resolve generic Microsoft.Extensions.Logging.ILogger<T> with Unity - get InvalidCastException

或者你可以使用


推荐阅读