Я пытаюсь смириться с использованием IoC / Dependency Injection, в то же время программируя на контракты, а не на определенные классы. Моя дилемма - это напряжение между:
Программируйте интерфейсы для IoC: я начал с IoC, в значительной степени полагаясь на интерфейсы. Судя по примерам проектов Spring, интерфейсы - это лучший способ программирования в соответствии с контрактом с IoC.
(... хотя обычно предпочтительны абстрактные классы: основным недостатком интерфейсов является то, что они гораздо менее гибкие, чем классы, когда дело доходит до эволюции API)
Делайте зависимости классов явными через конструктор. Мне кажется, что хорошей практикой программирования является передача зависимостей конструктору класса. Действительно, это внедрение зависимости.
... за исключением того, что вы не можете принудительно применять подпись конструктора в интерфейсах / абстрактных классах: ни интерфейсы, ни абстрактные классы не позволяют определять подпись конструктора (легко / элегантно). См. Также раздел 4.4 Рекомендаций по разработке фреймворка: НЕ < / strong> определить общедоступные или защищенные внутренние конструкторы в абстрактных типах. ... Конструкторы должны быть общедоступными, только если пользователям нужно будет создавать экземпляры типа.
Этот вопрос связан с предыдущим вопросом о переполнении стека: Интерфейс, определяющий подпись конструктора?
Но у меня вопрос:
Поскольку вы не можете определить конструктор в интерфейсе / абстрактном классе C #, как задается в вопросе выше, на практическом уровне:
Как согласовать это с разумной практикой передачи зависимостей через конструктор?
Изменить: Спасибо за ответы. Я надеюсь получить некоторое представление о том, что мне следует делать в этом случае. Просто не использовать аргументы contructor? Использовать какой-то метод Init (), который принимает зависимости? Edit2: Спасибо за отличные ответы, очень полезно.