C # логирование «эффекта русских кукол» в параметрах конструкторов

1

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

Речь идет о добавлении журналов в проект. Как было предложено, должно быть несколько регистраторов, и их следует определить "динамически". Таким образом, мы получаем классы, обладающие свойством Logger.

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

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

-

Точнее, это то, над чем я сейчас работаю:

  • Существует интерфейс ILogger который определяет функции LogError(string msg) например, LogError(string msg)). Различные Loggers будут реализовывать этот интерфейс.
  • Существует интерфейс ILoggable который будет реализован всеми классами, которые должны выполнять журналирование. Этот интерфейс имеет свойство public ILogger LoggerPte

Я использую статический класс LoggerUtility с LoggerUtility [ThreadStatic] static ILogger CurrentLogger и функцией:

public static void SetLoggerReference(ILoggable loggableClass)
{
    loggableClass.LoggerPte = CurrentLogger;
}

Вне класса loggable определяется CurrentLogger.

В конструкторе логируемого класса я должен вызвать LoggerUtility.SetLoggerReference(this);

Если найти этот способ более элегантным, хотя он может быть искажен, но я хотел бы знать, можно ли продолжить дальше...

Я только начал читать о пользовательских атрибутах, отражениях и АОП. Может кто-нибудь дать мне руку о том, как использовать такой атрибут, как [Loggable] чтобы автоматически заставить конструктор вызвать функцию SetLoggerReference(this) после конструктора без явного написания его в коде. Если это возможно...

  • 0
    Посмотрите на PostSharp. У них есть хорошее решение для этого, используя Aop
  • 0
    В этой статье описывается гибкий дизайн для построения решения, поддерживающего AOP.
Показать ещё 1 комментарий
Теги:
reflection
logging
aop

1 ответ

1
Лучший ответ

Вы слышали о шаблоне desginency desgin? Ваше первоначальное решение - простая инсталляция конструктора. Ваше окончательное решение - инъекция свойств, а все ваши бизнес-объекты должны иметь свойство LoggerPte. Ознакомьтесь с некоторыми решениями, как обрабатывать инъекции зависимостей и создавать/создавать ваши бизнес-объекты через контейнер внедрения dependecy (контейнер будет вводить свойство LoggerPte для вас, и вам не нужно вызывать свой статический метод в каждом конструкторе объекта). Я использую Unity Container (решение Microsoft), но вы можете найти много других.

Надеюсь, это то, что вам нужно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню