Во-первых, я не уверен, что я использую хорошие слова, чтобы описать свою проблему, извинения (английский не является моим родным).
Речь идет о добавлении журналов в проект. Как было предложено, должно быть несколько регистраторов, и их следует определить "динамически". Таким образом, мы получаем классы, обладающие свойством 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)
после конструктора без явного написания его в коде. Если это возможно...
Вы слышали о шаблоне desginency desgin? Ваше первоначальное решение - простая инсталляция конструктора. Ваше окончательное решение - инъекция свойств, а все ваши бизнес-объекты должны иметь свойство LoggerPte. Ознакомьтесь с некоторыми решениями, как обрабатывать инъекции зависимостей и создавать/создавать ваши бизнес-объекты через контейнер внедрения dependecy (контейнер будет вводить свойство LoggerPte для вас, и вам не нужно вызывать свой статический метод в каждом конструкторе объекта). Я использую Unity Container (решение Microsoft), но вы можете найти много других.
Надеюсь, это то, что вам нужно.