首页 > 解决方案 > 如何从 .NET Framework 初始化 .net Core ILogger 或 ILoggerFactory 并注入到 .Net Core 内置的类库中的构造函数

问题描述

我正在使用一个使用 .NET Core 构建的类库。该库只有一个公共类,其中一个构造函数接受 ILoggerFactory,另一个重载构造函数接受 ILogger。但我在使用 .NET Framework 4.7 构建的控制台应用程序中使用这个库。我的控制台应用程序使用 Log4Net 进行日志记录。但是我需要注入 ILogger 或 ILoggerFactory 的实例,以便类库日志的错误基于我的 log.config 设置。

我尝试如下

ILogger logger = new LoggerFactory().CreateLogger(); var contentManager = new ContentManager(logger);

但我不知道如何将 Log4Net 实例传递给 LoggerFactory。

private static ILog _log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
   ILogger logger = new LoggerFactory().CreateLogger<ContentManager>();
   var contentManager = new ContentManager(logger);
   contentManager.Run();
}

我没有发现任何记录,并且 ContentManager 不会引发任何异常。我知道 ILogger 实例对我的控制台应用程序中的 Log4Net 一无所知,我需要如何传递 Log4Net 实例?在这方面需要帮助。

标签: c#.net

解决方案


尝试使用适配器模式来促进对 Log4Net 的委托。我不熟悉 Log4Net,但我想你会理解这个例子:

class MyLoggerAdapter : Library.ILogger 
{
    private readonly ILog _delegation;

    public MyLoggerAdapter(ILog delegation)
    {
        _delegation = delegation;
    }

    public void ILogger.Debug(string msg, params object[] p)
    {
        _delegation.Debug(msg, p); 
    }
}

然后在你的代码中你可以这样做:

private static ILog _log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
   MyLoggerAdapter logAdapter = new MyLoggerAdapter(_log);
   var contentManager = new ContentManager(logAdapter);
   contentManager.Run();
}

推荐阅读