Первый пример - инжектор конструктора. Вы вводите класс с ответственностью за печать в класс.
Во втором примере вы создаете новый класс с одним из 2 аргументов и используете аргумент в конструкторе. Это плохо по нескольким причинам:
- Ваш конструктор не должен выполнять значительную работу, это либо сохранение, либо печать в конструкторе
- Ваши разные конструкторы делают это по-разному. Конструктор должен создавать только новый экземпляр вашего класса.
- Не ясно, что разные конструкторы действительно что-то делают, когда им дают разные объекты.
- Если вы передаете объекты конструктору, а затем он просто вызывает их, почему бы вам просто не иметь код, который создает этот класс, для вызова методов в реализациях
ISave
и IPrint
. В конце концов, они должны быть в состоянии передать их методу. Если ваш объект хранит их внутри, тогда они могли быть предоставлены, когда ваш объект был создан (как в корне композиции), и клиентскому коду, который вызывает Print
вашего объекта, не нужно было бы ничего знать о том факте, что ISave
и IPrint
реализации существуют,
Внедрение в конструктор касается вашего класса, запрашивающего зависимости, которые есть в его конструкторе, поэтому ясно, что это за зависимости. Требуя зависимости, а не создавая их, становится проще тестировать класс, поскольку вы можете вводить фиктивные зависимости для целей тестирования.
Первый вариант хорош, и если вы хотите добавить сохранение, вы должны добавить дополнительный аргумент в конструктор, чтобы получить интерфейс ISave
, а также интерфейс IPrint
и иметь метод Save
, который будет делегат для ISave
implmentation.
Внедрение зависимостей и программирование интерфейса облегчает последующее изменение функциональности. Например, вы могли бы легко сделать его выводом в файл (изменив передаваемый вами интерфейс IPrint
или изменив его для сохранения в xml-файл или веб-сервис, изменив реализацию ISave
, которую вы передаете. класс, слабо связанный с реализациями сохранения и печати
Я бы прочитал этот отличный ответ для получения дополнительной информации по DI / IOC