Dependency Injection wth NLog
我有一个.NET Core Web应用程序,我正在尝试通过NLog向其中添加日志记录。
在以前的项目中,我只是在每个类的顶部使用以下内容:
1 | private static Logger logger = LogManager.GetCurrentClassLogger(); |
我正在尝试尽可能多地遵循此项目的最佳做法。
我的问题是,我该如何注入一个记录器,该记录器具有要注入的类的完全限定名称?
到目前为止,在我的startup.cs文件中,我具有以下内容:
1 | services.AddScoped<BLL.Logging.NLogLogger>(); |
此刻,
为简化问题并使之更加通用:
如何传递.NET Core将注入类的类的名称?
我已经考虑过类似以下的内容,但不确定如何实现:
1 | services.AddScoped<BLL.Logging.NLogLogger>(serviceProvider => new BLL.Logging.NLogLogger("class name here")); |
使用DI指定
1 2 3 4 5 6 7 8 9 | public class TodoController : Controller { private readonly ILogger _logger; public TodoController(ILogger<TodoController> logger) { _logger = logger; } } |
参考文献:
- ASP.NET Core入门(csproj vs2017)
- ASP.NET Core 2入门
- ASP.NET Core 3入门
我想我已经找到了一个可以接受的解决方案,尽管不完全是我提出问题的方式。
首先,我创建一个" LoggerFactory",它具有一个称为" GetLogger"的方法(该方法创建具体的NLog Logger并接受类名作为参数),然后直接注入该工厂而不是记录器。
LoggerFactory:
1 2 3 4 5 6 7 | public class LoggerFactory : ILoggerFactory { public ILogger GetLogger(string fullyQualifiedClassName) { return new NLogLogger(fullyQualifiedClassName); } } |
NLogLogger:
1 2 3 4 5 6 7 8 | public class NLogLogger : ILogger, INLogLogger { NLog.Logger mylogger; public NLogLogger(string fullyQualifiedClassName) { mylogger = NLog.LogManager.GetLogger(fullyQualifiedClassName); } } |
Startup.cs:
1 | services.AddScoped<BLL.Logging.ILoggerFactory>(); |
在我的控制器类中,我有:
1 2 3 4 5 6 | private BLL.Logging.ILogger logger;//my NLogLogger inherits this interface public HomeController(BLL.Logging.ILoggerFactory loggerFactory) { logger = loggerFactory.GetLogger(this.GetType().FullName); } |
所以我现在有效地做的是,而不是注入实际的Logger本身(这表明@Steven不可能以我尝试的方式进行),而是注入了实用程序来创建实例包装NLog的记录器的说明。
我仍然有责任在类中创建记录器,但是至少我已经与基础记录框架(NLog)分离了。