Ninject.Extensions.Logging.nlog2 - Как? - PullRequest
12 голосов
/ 17 августа 2011

Просматривая библиотеку nuget, я наткнулся на Ninject.Extensions.Logging.nlog2 . Некоторые гуглят и пытаются разобраться, я не могу понять, как и почему вы бы использовали это расширение.

Желательно ли использовать с MVC 3?

Какой именно смысл?

Как вы это используете?

Ответы [ 2 ]

17 голосов
/ 19 августа 2011

Это действительно очень просто; и 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 практически в каждом проекте, то это хороший способ отделить ваш код от любой конкретной библиотеки журналов.

0 голосов
/ 24 апреля 2012

Если вы хотите использовать внедрение зависимостей через конструктор, вы можете передать интерфейс ILoggerFactory.

Вот как я это сделал.

using Ninject.Extensions.Logging;
public class MyClass
{
    private readonly ILogger _log;

    public MyClass(ILoggerFactory logFactory)
    {
        _log = logFactory.GetCurrentClassLogger();
    }

    public void DoWork()
    {
        _log.Info("Doing work!");
    }
}

Проблема решена!

Надеюсь, это кому-нибудь поможет.

...