Прошу вибачення, якщо це здається черговим повторенням питання, але кожен раз, коли я знаходжу статтю щодо цієї теми, вона здебільшого просто говорить про те, що таке DI. Отже, я отримую DI, але я намагаюся зрозуміти необхідність контейнера IoC, в який, схоже, потрапляють усі. Чи є сенс контейнера IoC насправді просто "автоматичним вирішенням" конкретної реалізації залежностей? Можливо, мої класи, як правило, не мають кількох залежностей, і, можливо, тому я не бачу великої справи, але я хочу переконатися, що я правильно розумію корисність контейнера.
Я зазвичай розбиваю свою бізнес-логіку на клас, який може виглядати приблизно так:
public class SomeBusinessOperation
{
private readonly IDataRepository _repository;
public SomeBusinessOperation(IDataRespository repository = null)
{
_repository = repository ?? new ConcreteRepository();
}
public SomeType Run(SomeRequestType request)
{
// do work...
var results = _repository.GetThings(request);
return results;
}
}
Отже, вона має лише одну залежність, а в деяких випадках вона може мати другу або третю, але не все так часто. Отже, все, що викликає це, може передати власне репо або дозволити використовувати репо за замовчуванням.
Що стосується мого теперішнього розуміння контейнера IoC, то все, що потрібно, це вирішення IDataRepository. Але якщо це все, що це робиться, то я не бачу в ній тонни значення, оскільки мої операційні класи вже визначають резервний запас, коли не проходила залежність. Тож єдиною іншою перевагою, про яку я можу придумати, є те, що якщо у мене є кілька операцій, таких як використовуючи ту саму резервну репо, я можу змінити це репо в одному місці, яке є реєстром / фабрикою / контейнером. І це чудово, але це так?
ConcreteRepository
і (2) ви можете надати додаткові залежності ConcreteRepository
(наприклад, з'єднання з базою даних).