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

Logging, Aspect Oriented Programming и Injection Dependency Injection - Попытка понять все это

Я знаю, что регистрация является основным прецедентом для АОП. Кроме того, обертки журналов также показаны в качестве случаев, когда вы хотите использовать DI, чтобы классы не были связаны с конкретной реализацией ведения журнала. Тем не менее, некоторые считают, что протоколирование обертки является анти-шаблоном. Прежде всего, такое мнение связано с тем, что в большинстве случаев обертка имеет тенденцию быть упрощенной и удаляет многие функции, специфичные для структуры ведения журнала. Если вы реализуете эти конкретные функции, почему бы просто не использовать инфраструктуру напрямую.

Я знаю об Common.Logging, который пытается абстрагировать большое количество функций log4Net, EntLib, NLog для вас, Однако даже здесь мы все еще имеем зависимость от Common.Logging. Не в способе тестирования кода/модуля в отношении интерфейсов и т.д., Но если проект умирает (прошло более года с момента последней версии), или вы хотите, чтобы последний переключился на журнал, который не поддерживается, это может вызвать проблемы.

Тем не менее, , если ведение журнала достигается с помощью AOP, даже необходимо использовать DI для зависимостей ведения журнала (то есть, почему бы просто не ссылаться прямо на NLog)? Да, что часть кода AOP будет тесно связана, но логика классов, для которых требуется unit test, лишена зависимостей ведения журнала (по крайней мере, до того, как произойдет переплетение). В этот момент я немного потерял (я еще не пробовал АОП). После ткачества, не использовав DI для кода AOP, вызывают проблемы для модульного тестирования тестируемого метода? Или может один unit test без плетения кода AOP?

Если для пользователя программного обеспечения не требуется ведение журнала, я не уверен, насколько полезно проверить, что ведение журнала произошло с помощью mocks. Я бы подумал, что бизнес-логика тестируемого метода - это то, что больше всего будет интересовать тестирование. Наконец, если вы хотите использовать TDD/BDD, не нужно ли использовать DI для зависимостей ведения журнала в коде AOP? Или просто не будет тестировать сторону AOP?

Как вы можете видеть, я пытаюсь понять, что наиболее практичный подход заключается в разработке приложения, которое будет использовать AOP для сквозных задач и DI для проектирования/тестирования. Поскольку AOP является относительно новым, и наиболее часто встречающийся журнал, каков рекомендуемый подход?

4b9b3361

Ответ 1

Ведение журнала - это не Служба, это сквозная проблема. Таким образом, он лучше всего реализован с помощью Decorator. Тем не менее, добавление множества декораторов только для того, чтобы включить ведение журнала различных служб, как правило, нарушает DRY, и в этом случае вы можете затем развить эти Декораторы в один перехватчик.

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

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

Вот пример, в котором рассказывается о Декораторах и Перехватчиках для инструментария (очень похоже на ведение журнала).

Если вы хотите узнать больше о AOP и DI, вы можете просматривать онлайн эту беседу, которую я дал в GOTO Copenhagen 2010.