Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Решил начать с самого простого: объект лог, если он объявлен как поле некого класса должен быть статическим, как советуют на сайте nlog.Использование статических переменных в любом виде — страшное зло. И система логирования не исключение.
Невозможно нормально настроить раздельное логирование экземпляров объекта с разными настройками, например. Для разрешения зависимостей нужно использовать DI, а не статический класс внешней библиотеки.
In most cases you will have one logger per class, so it makes sense to give logger the same name as the current class. LogManager exposes a method which creates a logger for current class, called GetCurrentClassLogger(). Because loggers are thread-safe, you can simply create the logger once and store it in a static variable:
namespace MyNamespace
{
public class MyClass
{
private static Logger logger = LogManager.GetCurrentClassLogger();
}
}
2. Вам не сильно важна производительность
Метод GetCurrentClassLogger использует обращение к текущему стэку вызовов, что является небыстрой операцией.
github.com/NLog/NLog/blob/master/src/NLog/LogManager.cs#L161
Например, сотни или тысячи классов, длинные цепочки от контекста, до конкретного класса
Напомню, внедрения зависимостей еще нет.ССЗБ. Вы продолжаете писать неправильный код, потому что сейчас лениво сделать DI хотя бы в виде ServiceLocator-а, умеющего создавать графы объектов для тех классов, которые про DI не знают.
ССЗБ. Вы продолжаете писать неправильный код, потому что сейчас лениво сделать DI хотя бы в виде ServiceLocator-а, умеющего создавать графы объектов для тех классов, которые про DI не знают.
Кстати, чисто, что бы улучшить мир, поделитесь примером или описанием «ServiceLocator-а, умеющего создавать графы объектов для тех классов, которые про DI не знают».
Locator с методом Resolve<T>(), весь код которого заключается в обращении к DI-контейнеру. При необходимости получить экземпляр поддерживающего DI класса из кода, который про DI не знает, вместо new Foo() пишем Locator.Resolve<Foo>(). В случае наличия параметров, которые надо передать из этого кода, делаем Locator.Resolve<IFooFactory>.Create(arg1, arg2).
Опыт кастомного анализа c# кода