c# - 在依赖注入期间使用 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”。
我错过了什么?
解决方案
首先,如果 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
或者你可以使用
推荐阅读
- elasticsearch - 如何使用 Nest 客户端对 Elasticsearch 操作(如 UpdateByQuery 或 Reindex)启用自动切片?
- python - discord.py 中的数学命令和错误
- xdebug - Xdebug 只能在它已进入的页面上中断
- node.js - 发票已发送给用户,但我无法使用 node.js 收到任何条纹发票邮件
- typo3 - TYPO3 网站迁移问题 - TYPO3 后端工作但前端不工作
- python - bta-lib 错误:尝试使用 rsi 指标但给出 ValueError: cannot set using a slice indexer with a different length than the value
- django - Django获取发送请求的子域
- c# - 如何在统一变换中冻结 Y 旋转。 LookAt()?
- python - Python - 从float继承并调用str和repr时出现递归错误
- reactjs - 错误:我的子组件中的 useState 值没有立即更改,您需要按两次提交按钮