Общий предпочтительный подход - максимально использовать инжектор конструктора.
Внедрение в конструктор точно определяет, каковы необходимые зависимости для правильного функционирования объекта - нет ничего более раздражающего, чем обновление объекта и его сбой при вызове метода, поскольку некоторая зависимость не установлена. Объект, возвращаемый конструктором, должен находиться в рабочем состоянии.
Старайтесь иметь только один конструктор, он упрощает дизайн и позволяет избежать двусмысленности (если не для людей, для контейнера DI).
Вы можете использовать внедрение свойства, когда у вас есть то, что Марк Симанн называет локальным значением по умолчанию в своей книге «Внедрение зависимостей в .NET»: зависимость является необязательной, потому что вы можете обеспечить хорошую работающую реализацию, но хотите разрешить вызывающей стороне указывать другую при необходимости.
(бывший ответ ниже)
Я думаю, что инъекция в конструктор лучше, если инъекция обязательна. Если это добавляет слишком много конструкторов, рассмотрите возможность использования фабрик вместо конструкторов.
Впрыск сеттера будет полезен, если впрыск является необязательным, или если вы хотите изменить его наполовину через желоб. Я вообще не люблю сеттеров, но это дело вкуса.