Ну допустим, давайте пофантазируем, что может помешать передавать через конструктор LogFactory.
Например, сотни или тысячи классов, длинные цепочки от контекста, до конкретного класса, наличие нескольких клентов (нескольких разных контекстов). Все это может существенно усложнить работу по добавлению во все конструкторы LogFactory.
Напомню, внедрения зависимостей еще нет.
2. Вам не сильно важна производительность
Метод GetCurrentClassLogger использует обращение к текущему стэку вызовов, что является небыстрой операцией.
github.com/NLog/NLog/blob/master/src/NLog/LogManager.cs#L161
Но разве плохая производительность не подталкивает к использованию именно «статической» переменной, которая создается одна на тип (класс), а не на каждый объект?
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();
}
}
Невозможно нормально настроить раздельное логирование экземпляров объекта с разными настройками, например. Для разрешения зависимостей нужно использовать DI, а не статический класс внешней библиотеки.
Согласен, но у меня есть пример, когда DI еще нет, а лог уже есть.
Я придерживаюсь мнения, что нет плохих качеств, а есть не хорошие размеры.
Другими словами, статические переменные конечно зло, но все-таки есть исключения.
Мне важно проверять, что файл был действительно удален, потому что, может быть, что я открыл файл в одном месте и пытаюсь удалить до того, как я его закрыл.
А если речь идет не о модульных тестах?
Модульный тест проверят, что мой код вызвал удаление файла.
Интеграционный тест должен проверять, что файл действительно был удален.
Может я не правильно выразился, но естественно, я хочу проверять свой код, и даже если он написан в финализаторе.
Работа с базовыми библиотеками (работа с файлами), требует правильного вызова (включая правильную последовательность), а это уже мой код, который я опять же хочу проверить.
CA1063 хорошая вещь, но в данном случае слишком сильная: я бы начал с финализатора, а правило CA1063 проверяет и Dispose() тоже.
Кстати, а какие есть способы добавить свою статическую проверку (правило)? Microsoft Code Analysis вроде бы не позволяет. Может есть плагин для R#? Или можно самому такой реализовать. У меня есть желание анализировать наши кастомные штуки, но вот пока не знаю как (приходится простым поиском и глазками).
Вам не нужно тестировать File.Delete. Это уже не ваша забота. Что стоит протестировать — это факт того, что File.Delete вызывается. Для этого в Visual Studio есть Fake Assemblies.
Что бы использовать Fake Assemblies, мне нужно иметь тестовый проект от Microsoft или достаточно обычного проекта с nunit тестами?
Неужели опять, как в молодсти, придется «ассемблером» развлекаться :).
Например, сотни или тысячи классов, длинные цепочки от контекста, до конкретного класса, наличие нескольких клентов (нескольких разных контекстов). Все это может существенно усложнить работу по добавлению во все конструкторы LogFactory.
Напомню, внедрения зависимостей еще нет.
А еще нет, но попробую посмотреть.
Но разве плохая производительность не подталкивает к использованию именно «статической» переменной, которая создается одна на тип (класс), а не на каждый объект?
или это, что бы nlog было сложнее выпилить? :)
Согласен, но у меня есть пример, когда DI еще нет, а лог уже есть.
Другими словами, статические переменные конечно зло, но все-таки есть исключения.
и конечно, спасибо, за наводку.
Модульный тест проверят, что мой код вызвал удаление файла.
Интеграционный тест должен проверять, что файл действительно был удален.
Работа с базовыми библиотеками (работа с файлами), требует правильного вызова (включая правильную последовательность), а это уже мой код, который я опять же хочу проверить.
Кстати, а какие есть способы добавить свою статическую проверку (правило)? Microsoft Code Analysis вроде бы не позволяет. Может есть плагин для R#? Или можно самому такой реализовать. У меня есть желание анализировать наши кастомные штуки, но вот пока не знаю как (приходится простым поиском и глазками).
Или эту работу уже кто-нибудь сделал?
Что бы использовать Fake Assemblies, мне нужно иметь тестовый проект от Microsoft или достаточно обычного проекта с nunit тестами?
Спасибо.