Я был поклонником инъекций конструктора до тех пор, пока я знал о DI, потому что, на мой взгляд, это конструктор для . В нем говорится «Мне нужны экземпляры следующих классов / интерфейсов для выполнения моей работы» - например, передайте мне File
и PrintWriter
, и я напишу содержимое первого последнему.
И, конечно, это означает, что код не знает о структуре DI, так как класс просто создается с передачей требуемых зависимостей. Кроме того, я не вижу необходимости в фабриках в этом сценарии, поскольку класс является собственной фабрикой через конструктор.
Что касается сценария, который вы определили во втором абзаце, я не уверен, что это строго связано с внедрением зависимостей, а просто с дизайном иерархии классов и обязанностей. Либо Ваш класс точно знает, как создать Event
, который соответствует, например, неудачный вход в систему, и в этом случае он делает это (то есть, вызывая конструктор класса); или , он не знает, как, и в этом случае ему придется делегировать некоторому виду фабрики для создания Event
.
И в этом случае вы можете настроить свой класс на использование одной и той же фабрики для создания всех десяти событий (определить интерфейс EventFactory
с 10 методами), или вы можете определить отдельный интерфейс фабрики (и реализацию) для каждого типа события, которое необходимо построить. В этом последнем случае вам также необходимо передать десять различных фабрик в конструктор вашего основного класса.
Но опять же - это не имеет ничего общего с DI ИМХО, это вопрос того, как вы разрабатываете свои классы для гибкости (или «корпоративности») против прямолинейности. По моему мнению, они ортогональны; сначала вы определяете, в каких соавторах нуждается ваш класс (десять фабрик, одна фабрика или ноль фабрик) и , а затем вы используете DI для обеспечения этих зависимостей. Наличие или отсутствие DI не должно влиять на дизайн вашего класса.