W wielu artykułach w Internecie pojęcia Inwersja kontroli i zasada inwersji zależności wydają się być pomieszane i używane jako synonimy (dalsze zamieszanie jest wymuszane przez narzędzia nazywane „kontenerami DI” i „kontenerami IoC”). Artykuł w Wikipedii robi dobrą robotę, próbując wyjaśnić, że IoC to nie to samo, co DI:
inwersja kontroli (IoC) opisuje projekt, w którym niestandardowe części programu komputerowego odbierają przepływ kontroli z ogólnej biblioteki wielokrotnego użytku
Tak więc DIP polega na tym, aby moduły zależały od abstrakcji, a nie od konkretnych implementacji.
IoC polega na przekazaniu kontroli nad przepływem programu do oddzielnego modułu. Jedną z rzeczy, które możesz zrobić w tym module, jest rozwiązanie zależności w czasie wykonywania.
Ta różnica wydaje się sprawiedliwa, ale nigdy nie widziałem, aby ktokolwiek wspominał o innych zastosowaniach zasady IoC innych niż rozwiązywanie zależności. Definicja Wikipedii jest dość szeroka i wydaje się, że możesz zrobić o wiele więcej dzięki modułowi, który ma możliwość wykonywania wywołań w niestandardowym kodzie na podstawie jego konfiguracji i wewnętrznej logiki.
Oto kilka pytań, których nie potrafię do końca zrozumieć:
- Jaki jest faktyczny związek między IoC a DIP? Czy IoC zawsze służy jako środek implementacji DIP?
- Dlaczego narzędzia do rozwiązywania zależności nazywane są zarówno kontenerami DI, jak i IoC? Oznacza to, że DI i IoC są tym samym.
Uwaga : To pytanie nie jest duplikatem Jaka jest różnica między DI a IoC , ponieważ ten ostatni pyta o Wstrzyknięcie zależności, a nie Odwrócenie zależności.
źródło
Odpowiedzi:
Istnieje świetny artykuł na stronie Martina Fowlera, który zawiera rozdział poświęcony różnicy między DIP, DI i IoC . Istota tego (skopiowana z tej strony) to
źródło
ISomeInterface object = container.Resolve<ISomeInterface>()
czy to IoC, czy nie?