Перевага конструктора має те, що він робить залежність явною і змушує клієнта надати примірник. Це також може гарантувати, що клієнт не може змінити примірник пізніше. Один (можливий) мінус - ви повинні додати параметр до свого конструктора.
Інструмент Setter Injection має ту перевагу, що він не потребує додавання параметра до конструктора. Він також не вимагає від клієнта встановлення примірника. Це корисно для необов'язкових залежностей. Це також може бути корисно, якщо ви хочете, щоб клас створив, наприклад, реальне сховище даних за замовчуванням, а потім у тесті ви можете використовувати сетер для заміни його на тестовий екземпляр.
Наскільки я можу сказати, інтерфейсна ін'єкція не сильно відрізняється від інжекторної інжекції. В обох випадках ви (необов'язково) встановлюєте залежність, яку можна змінити пізніше.
Зрештою, це питання переваги і того, потрібна чи ні залежність . Особисто я використовую інжектор конструктора майже виключно. Мені подобається, що це робить залежності класу явними, змушуючи клієнта надати екземпляр у конструкторі. Мені також подобається, що клієнт не може змінити примірник після факту.
Часто моєю єдиною причиною проходження двох окремих реалізацій є тестування. У виробництві я можу здати в DataRepository
, але в тестуванні я пройшов би в FakeDataRepository
. У цьому випадку я зазвичай надаю два конструктори: один без параметрів і інший, який приймає a IDataRepository
. Потім у конструкторі, що не має параметрів, я буду ланцюгом виклику до другого конструктора і передаю в a new DataRepository()
.
Ось приклад в C #:
public class Foo
{
private readonly IDataRepository dataRepository;
public Foo() : this(new DataRepository())
{
}
public Foo(IDataRespository dataRepository)
{
this.dataRepository = dataRepository;
}
}
Це відоме як ін'єкція бідної людини у бідну людину. Мені це подобається, тому що у виробничому коді клієнта мені не потрібно повторюватись, маючи кілька повторних тверджень, схожих
var foo = new Foo(new DataRepository());
Однак я все-таки можу пройти альтернативну реалізацію для тестування. Я усвідомлюю, що з ІД бідних чоловіків я сильно кодую свою залежність, але це прийнятно для мене, оскільки я здебільшого використовую DI для тестування.