При проектировании системы я часто сталкиваюсь с проблемой использования множества модулей (журналирование, доступ к базе данных и т. Д.) Другими модулями. Вопрос в том, как мне предоставить эти компоненты другим компонентам. Два ответа кажутся возможными для внедрения зависимости или использования фабричного шаблона. Однако оба кажутся неправильными:
- Фабрики затрудняют тестирование и не позволяют легко менять реализации. Они также не делают зависимости очевидными (например, вы изучаете метод, не обращая внимания на тот факт, что он вызывает метод, который вызывает метод, который вызывает метод, использующий базу данных).
- Внедрение зависимостей массово расширяет списки аргументов конструктора и размазывает некоторые аспекты по всему вашему коду. Типичная ситуация, когда конструкторы более половины классов выглядят так
(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d)
Вот типичная ситуация, с которой у меня проблема: у меня есть классы исключений, которые используют описания ошибок, загруженные из базы данных, используя запрос, который имеет параметр настройки языка пользователя, который находится в объекте сеанса пользователя. Поэтому для создания нового исключения мне нужно описание, которое требует сеанса базы данных и сеанса пользователя. Поэтому я обречен на перетаскивание всех этих объектов по всем моим методам на тот случай, если мне может понадобиться сгенерировать исключение.
Как мне решить такую проблему ??