Подтвердить что ты не робот

Должна ли внедряться инфраструктура регистрации при использовании IoC/DI, если используется фаза регистрации?

Я использую Autofac в качестве своего IoC, и из всего, что я читал по теме, DI учит использовать "инъекцию конструктора", чтобы явно выявлять зависимости классов... Тем не менее, я также использую logging facade (Common.Logging) с Log4Net и создал модуль Autofac для его ввода. Теперь, в каждом классе, в котором я хочу выполнить некоторую запись, у меня есть дополнительный параметр конструктора (см. Образец №1)....

Мне интересно, нужно ли регистрировать DI при использовании фасада лесозаготовки? Я понимаю, что явно выявление зависимостей через подпись конструктора является хорошей архитектурой. но в случае каротажного фасада я верю в следующее:

  • Я могу по-прежнему "менять" структуру ведения журнала в любое время
  • Класс IMHO на самом деле не зависит от Logger. Если протокол не настроен, используется NullLogger. Это почти "это, если вам это нужно", и "это не сработает, если вы не предложите его" (см. Образец № 2).

Итак, что думают другие? Является ли инъекционный каротаж фасад излишним? Есть несколько похожих вопросов по этой теме, но в более общих терминах (инфраструктура) - меня в основном интересуют вход....

// IoC "way"
public class MyController : BaseController
{
    private readonly ILog _logger;

    public MyController(ILog logger)
    {
        _logger = logger;
    }

    public IList<Customers> Get()
    {
        _logger.Debug("I am injected via constructor using some IoC!");
    }
}

// just use the logger "way"
public class MyController : BaseController
{
    private static readonly ILog Logger = LogManager.GetCurrentClassLogger();

    public IList<Customers> Get()
    {
        Logger.Debug("Done! I can use it!");
    }
}
4b9b3361

Ответ 1

Регистрация - это просто инфраструктура. Впрыскивание это чрезмерное. Я лично даже не использую слой абстракции. Я использую статические классы, которые библиотека предоставляет напрямую. Моя мотивация заключается в том, что маловероятно, что я переключу библиотеку журналов в текущем проекте (но могу переключиться на следующий проект).

Однако вы используете контроллеры в своем примере. Зачем вам входить в систему? Контроллер - это всего лишь адаптер между представлением и моделью (бизнес-логика). Не нужно входить в систему.

Обычно вы выполняете только вход в классы, которые содержат бизнес-логику и на верхнем уровне, чтобы иметь возможность регистрировать необработанные исключения. Это тяжелые случаи для отладки и, следовательно, места, где требуется ведение журнала.

Наличие для входа в другие места означает, что вам нужно реорганизовать, чтобы правильно инкапсулировать вашу бизнес-логику.

Ответ 2

Это может быть более старая запись, но я хотел бы прослушивать.

Идея о том, что IOC системы каротажа переполнена, близорука.

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

Как я могу unit test регистрировать мои компоненты, если мой проверенный модулем код теперь заблокирован для конкретного регистратора? Распределенные системы часто используют регистраторы, которые регистрируются для централизации источников, а не для плоских файлов в файловой системе.

Ввод логгера для меня ничем не отличается от ввода API подключения к базе данных или внешней веб-службы. Это ресурс, который требуется приложению, и как таковой, поэтому вы можете протестировать использование компонента указанным ресурсом. Возможность издеваться над указанной зависимостью, чтобы проверить выход моего компонента независимо от получателя регистрации, имеет решающее значение для сильного модульное тестирование.

И учитывая, что контейнеры IOC выполняют такую ​​игру для инъекций, мне кажется, что НЕ использовать IOC для ввода регистратора не является более обоснованным подходом, чем при этом.

Ответ 3

Теперь, в каждом классе, в котором я хочу сделать некоторые записи, у меня есть дополнительные параметр конструктора

Если вам нужна регистрация многих классов в вашей системе, в вашем дизайне что-то не так. Либо вы слишком много регистрируетесь, либо нарушаете принцип единой ответственности, поскольку ведение журнала - это сквозная проблема, и вы не должны загромождать свои классы с помощью сквозных проблем, таких как ведение журнала.

Я ответил на (совершенно другой) вопрос полгода назад, и мой ответ применим к вашему вопросу. Пожалуйста, прочитайте .

Ответ 4

Я лично считаю, что это слишком много.

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