Вход в рамках всей программы - PullRequest
0 голосов
/ 12 ноября 2018

Как мне регистрироваться везде в программе, не объявляя параметр ILogger в каждом классе? Я бы хотел, чтобы лучшие практики регистрировались везде внутри программы.

MyClass(ILogger<MyClass> logger)
{
    _logger = logger;
}

Должен ли я использовать статический класс, как описано здесь ?

public class ApplicationLogging
{
    private static ILoggerFactory _Factory = null;

    public static void ConfigureLogger(ILoggerFactory factory)
    {
        factory.AddDebug(LogLevel.None).AddStackify();
        factory.AddFile("logFileFromHelper.log"); //serilog file extension
    }

    public static ILoggerFactory LoggerFactory
    {
        get
        {
            if (_Factory == null)
            {
                _Factory = new LoggerFactory();
                ConfigureLogger(_Factory);
            }
            return _Factory;
        }
        set { _Factory = value; }
    }
    public static ILogger CreateLogger() => LoggerFactory.CreateLogger();
}    

1 Ответ

0 голосов
/ 12 ноября 2018

Я думаю, что не следует использовать логгер со статической зависимостью. Лично я бы вставил это в конструктор класса. Зачем? Ну, статические зависимости в виде статического свойства имеют следующие проблемы:

  • В случае юнит-тестов их сложно издеваться. Если вы внедрите регистратор в CTOR, вы можете, например, Moq, изменить регистрацию, например стандартный вывод (хорошо, это также возможно, например, с помощью файла конфигурации log4net).

  • Использование статических свойств может сделать ваш код "недетерминированным". Зачем? Статическое свойство инициализируется при первом обращении к классу. Поэтому, если вы измените свой код, инициализация статического свойства может быть вызвана раньше или позже. Если у вас есть ошибка в инициализации, это будет трудно найти. Зачем? Потому что у вас нет входа.

  • Если вы хотите изменить каркас журналирования, вы должны найти все статические ссылки на него. Хорошо, это не такая сложная задача с grep или современными IDE. Однако, если вы введете зависимость от логгера, компилятор покажет (на основе ошибок компиляции), какие строки кода вы должны изменить (просто удалите ссылку на логгер из файла решения).

Надеюсь, это поможет.

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