簡體   English   中英

在 net-core2.0 中使用 NLog 進行 DI

[英]DI with NLog in net-core2.0

我對 net core 2.0 上的 NLog 有點缺乏理解我想在我的控制台應用程序中創建一個帶有構造函數的類。

機器人

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<Bot> 在 Program 課程中,我只有NLog.ILogger “部分”DI 的最佳實踐是什么? 我想將字符串 botToken、WebProxy httpProxy 傳遞給Bot類中的構造函數,但希望ILogger<Bot>記錄器自動解析。

是否可以?

我有一個想法將IOptions<ApplicationMode> appSettings 傳遞給 Bot 類,但這將是一個臟代碼,不是嗎?

這個

NLog.ILogger Logger = LogManager.GetCurrentClassLogger();

返回NLog.Logger類型的對象。

另一方面,您的類需要Microsoft.Extensions.Logging.ILogger<Bot>類型的構造函數參數。 因此,雖然兩者都被命名為ILogger但它們實際上是完全不同的類型。

一個答案是將您的課程更改為期望NLog.Logger而不是Microsoft.Extensions.Logging.ILogger<Bot> 那么你可以這樣做:

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

那可能會奏效。 我唯一擔心的是它使您的Bot類依賴於 NLog。 現在它取決於框架抽象,這更好,因為這意味着您可以使用 NLog 或替換其他一些記錄器。

因此,要保持原樣,您需要創建一個使NLog.ILogger適應Microsoft.Extensions.Logging.ILogger<Bot>

(當我到達這一點時,我開始自己編寫適配器。那時我意識到它幾乎肯定已經存在了。)

幸運的是,NLog 已經在NLog.Extensions.Logging中完成了這項工作,您可以將其添加為 NuGet 包。 他們提供這個是完全有道理的,因為並不是每個想要使用 NLog 的人都希望將 NLog 特定的類型放在每個需要記錄器的類中。

他們提供了有關如何在控制台應用程序中進行配置的文檔


我從這個開始:

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

如果我認為我會想出那個,那我就錯了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM