Дизайн для регистрации или добавления регистрации позже? - PullRequest
2 голосов
/ 30 марта 2011

При написании нового приложения или инфраструктуры вы рассматриваете возможность входа с самого начала? И, таким образом, есть много классов, импортирующих / использующих интерфейс ILogger (внутри конструктора для инъекций), например?

Что, если у вас уже есть (большая часть) ваше приложение, но вы не подумали войти в большинство или во все ваши классы. Как бы вы добавили к ним логирование?

Моя проблема с добавлением потом заключается в том, что если вам нужно войти глубоко в цепочку зависимостей, вам может понадобиться добавить интерфейс ILogger ко многим классам.

Ответы [ 3 ]

6 голосов
/ 30 марта 2011

Я всегда рассматриваю логирование с самого начала.

Во-первых, необходимо решить, какую среду ведения журналов использовать, но обычно это быстрый выбор. Я лично часто использую log4net, что означает, что каждый класс использует статический LogManager.GetLogger для получения экземпляра регистратора. Фактическое поведение каждого вызова журнала затем определяется в конфигурации (где я должен регистрироваться тоже, на каком уровне я должен войти, и т. Д.).

Однако, что более важно, вы должны думать о , что требует регистрации , когда вы фактически разрабатываете свое приложение. Не существует момента, когда вы более настроены на свой код, чем когда вы его пишете, и вы, вероятно, лучше представляете себе, что нужно регистрировать, чем в любое другое время. Гораздо проще ретроспективно удалить чрезмерно подробное ведение журнала, которое вам не нужно, и добавить добавление ведения журнала, которое должно быть там.

Так что да - всегда думайте о регистрации, когда вы запускаете свое приложение, не пытайтесь установить его заново, если можете помочь.

[РЕДАКТИРОВАТЬ: В ответ на ваш вопрос о том, как вводить]

Возможно, самый простой подход (при условии, что вы не используете контейнер IoC) - это пойти по пути внедрения свойства или конструктора. Лично я предпочитаю последнее для такого рода вещей, поэтому я бы хотел получить что-то подобное для log4net:

public class MyClass
{
    private readonly ILog _logger;

    // usually I don't supply a logger directly, 
    // hence I let this ctor get a logger from the log manager.
    public MyClass() : this (LogManager.GetLogger(typeof(MyClass)))
    {

    }

    // this ctor only gets called directly if I want to mock out logging
    public MyClass(ILog logger)
    {
        _logger = logger;
    }
}
1 голос
/ 30 марта 2011

Зачем вам "многие" классы реализуют ILogger? Этого должно быть достаточно, чтобы один или два класса его реализовали, например, «DatabaseLogger» и «FileLogger». Нужно передать экземпляр реализации ILogger, это правильно, это может быть сделано с помощью одиночного кода или путем внедрения зависимости.

0 голосов
/ 30 марта 2011

Я обычно использую одноэлементный класс для регистрации. Этот класс можно настроить для записи в файл журнала, таблицу базы данных или журнал событий Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...