Внедрение в конструктор явно выявляет зависимости, делая код более читабельным и менее подверженным необработанным ошибкам во время выполнения, если аргументы проверяются в конструкторе, но это действительно сводится к личному мнению, и чем больше вы используете DI, тем больше вы будете склоняться к тому или иному движению в зависимости от проекта. У меня лично есть проблемы с запахами кода как конструкторы с длинным списком аргументов, и я чувствую, что потребитель объекта должен знать зависимости, чтобы в любом случае использовать объект, так что это оправдывает использование инъекции свойства. Мне не нравится неявная природа внедрения свойств, но я нахожу это более элегантным, в результате чего код выглядит чище. Но, с другой стороны, внедрение в конструктор действительно обеспечивает более высокую степень инкапсуляции, и по своему опыту я стараюсь избегать конструкторов по умолчанию, поскольку они могут негативно повлиять на целостность инкапсулированных данных, если не соблюдать осторожность.
Выберите инъекцию по конструктору или по свойствам в зависимости от вашего конкретного сценария. И не думайте, что вы должны использовать DI только потому, что это кажется необходимым, и это предотвратит плохой дизайн и запах кода. Иногда не стоит использовать шаблон, если усилия и сложность перевешивают выгоду. Сохраняй это простым.