Это действительно очень просто; и NLog, и log4net ожидают, что вы будете использовать одноэлементные / статические ссылки для получения экземпляров регистратора:
private static Logger logger = LogManager.GetCurrentClassLogger();
Это широко считается анти-паттерном, но даже если у вас нет проблем с ним, он все равно идет вразрез, если вы пытаетесь реализовать внедрение зависимостей. В случае с NLog это даже не интерфейс ILog
или ILogger
, такой как log4net, это настоящий класс. Это имеет определенные недостатки, такие как невозможность создания прокси, отложенная загрузка, кэширование и т. Д.
То, что делает проект Ninject.Extensions.Logging, - это сначала предоставляет абстрактный класс ILogger
с простыми методами, такими как Info
, Error
и т. Д., Так что вы можете внедрить его как зависимость и переключить каркас ведения журнала, если Вы хотите:
public class WidgetProvider
{
private readonly ILogger log;
public WidgetProvider(ILogger log)
{
this.log = log;
}
}
Вот как DI должен работать - класс никогда не пытается захватить свои собственные зависимости, вместо этого они предоставляются конструктором или вызывающей стороной, как указано выше. Предполагая, что вы уже интегрировали Ninject себя в свой проект, это действительно все , что вам нужно сделать, нет никакой дополнительной работы.
Что касается того, что Ninject.Extensions.Logging.NLog2 делает , в частности - он просто обеспечивает реализацию для Ninject.Extensions.Logging на основе NLog2. Базовая библиотека Logging на самом деле не содержит никаких реализаций ILogger
, вам нужно подключить одну из определенных библиотек (NLog, NLog2 или log4net), чтобы она заработала.
Если вы переключаете свою библиотеку DI чаще, чем переключаете регистраторы, не беспокойтесь об этом. Но если вы похожи на меня и используете Ninject практически в каждом проекте, то это хороший способ отделить ваш код от любой конкретной библиотеки журналов.