Przepraszam, jeśli wydaje się to kolejną powtórką pytania, ale za każdym razem, gdy znajduję artykuł na ten temat, głównie mówi on o tym, czym jest DI. Tak, dostaję DI, ale staram się zrozumieć potrzebę kontenera IoC, do którego wszyscy chyba się pakują. Czy celem kontenera IoC jest po prostu „automatyczne rozwiązywanie” konkretnej implementacji zależności? Może moje klasy zwykle nie mają kilku zależności i może dlatego nie widzę wielkiego problemu, ale chcę się upewnić, że dobrze rozumiem użyteczność kontenera.
Zazwyczaj dzielę logikę biznesową na klasy, które mogą wyglądać mniej więcej tak:
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;
}
}
Więc ma tylko jedną zależność, aw niektórych przypadkach może mieć drugą lub trzecią, ale nie tak często. Tak więc wszystko, co to wywołuje, może przejść własne repozytorium lub pozwolić na użycie domyślnego repozytorium.
O ile obecnie rozumiem kontener IoC, wszystko, co robi kontener, to IDataRepository. Ale jeśli to wszystko, co robi, to nie widzę w tym mnóstwa wartości, ponieważ moje klasy operacyjne już definiują awarię, gdy nie przechodzi żadna zależność. Więc jedyną inną korzyścią, o której mogę myśleć, jest to, że jeśli mam kilka operacji, takich jak używając tego samego repozytorium rezerwowego, mogę zmienić to repozytorium w jednym miejscu, którym jest rejestr / fabryka / kontener. I to świetnie, ale czy o to chodzi?
ConcreteRepository
i (2) można podać dodatkowe zależności ConcreteRepository
(na przykład połączenie z bazą danych byłoby powszechne).