【问题标题】:DI with NLog in net-core2.0net-core2.0 中带有 NLog 的 DI
【发布时间】:2019-04-04 06:28:50
【问题描述】:

我对 net core 2.0 上的 NLog 有点不了解 我想在我的控制台应用程序中创建一个带有构造函数的类。

Bot.cs

public class Bot : IBot
{
    static TelegramBotClient _botClient;
    Microsoft.Extensions.Logging.ILogger<Bot> _logger;

    public Bot(string botToken, WebProxy httpProxy, ILogger<Bot> logger)
    {
        _logger = logger;
        _botClient = new TelegramBotClient(botToken, httpProxy);
        //...
    }
}

和 Program.cs

public static async Task Main(string[] args)
{
     //...

    appModel = configuration.GetSection("ApplicationModel").Get<ApplicationModel>();
    var userName = appModel.ProxyConfiguration.UserName;
    var password = appModel.ProxyConfiguration.Password;

    var httpProxy = new WebProxy(appModel.ProxyConfiguration.Url, appModel.ProxyConfiguration.Port)
    {
        Credentials = credentials
    };
    NLog.ILogger Logger = LogManager.GetCurrentClassLogger();
    _botClient = new Bot(appModel.BotConfiguration.BotToken, httpProxy, ???);

    //...
}

我应该怎么做才能在我的Bot 课程中获得Microsoft.Extensions.Logging.ILogger&lt;Bot&gt;?在程序类中,我只有NLog.ILogger。 “部分” DI 的最佳实践是什么?我想将字符串 botToken、WebProxy httpProxy 传递给 Bot 类中的构造函数,但希望 ILogger&lt;Bot&gt; 记录器自动解析。

有可能吗?

我有一个想法将IOptions&lt;ApplicationMode&gt; appSettings 传递给 Bot 类,但这将是一个脏代码,不是吗?

【问题讨论】:

  • 这条线不对:Microsoft.Extensions.Logging.ILogger&lt;Bot&gt; _logger;
  • 只使用ILogger类型的字段
  • @Galina 参考此评论可能对您有所帮助。 stackoverflow.com/a/51266541/3595964

标签: c# .net-core asp.net-core-2.0 nlog


【解决方案1】:

这个

NLog.ILogger Logger = LogManager.GetCurrentClassLogger();

返回NLog.Logger 类型的对象。

另一方面,您的类需要Microsoft.Extensions.Logging.ILogger&lt;Bot&gt; 类型的构造函数参数。因此,虽然两者都被命名为ILogger,但它们实际上是完全不同的类型。

一个答案是将您的班级更改为期待NLog.Logger 而不是Microsoft.Extensions.Logging.ILogger&lt;Bot&gt;。然后你可以这样做:

NLog.ILogger logger = LogManager.GetCurrentClassLogger();
_botClient = new Bot(appModel.BotConfiguration.BotToken, httpProxy, logger);

这可能会奏效。我唯一担心的是它使您的Bot 类依赖于NLog。现在它依赖于框架抽象,这更好,因为这意味着您可以使用 NLog 或替换其他一些记录器。

因此,要保持原样,您需要创建一个将NLog.ILogger 适配为Microsoft.Extensions.Logging.ILogger&lt;Bot&gt; 的类。

(当我达到这一点时,我开始自己编写适配器。那时我突然想到它几乎肯定已经存在了。)

幸运的是,NLog 已经在 NLog.Extensions.Logging 中完成了这项工作,您可以将其添加为 NuGet 包。他们会提供这个是完全合理的,因为不是每个想要使用 NLog 的人都希望将 NLog 特定类型放在需要记录器的每个类中。

他们provide documentation 了解如何在控制台应用程序中进行配置。


我是从这个开始的:

public class NLogger : ILogger
{
    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
        throw new NotImplementedException();
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        throw new NotImplementedException();
    }

    public IDisposable BeginScope<TState>(TState state)
    {
        throw new NotImplementedException();
    }
}

...想知道实现会是什么样子。事实证明,它看起来像这样:https://github.com/NLog/NLog.Extensions.Logging/blob/master/src/NLog.Extensions.Logging/Logging/NLogLogger.cs

如果我认为我会想出这个,那我就错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多