Aby mówić o żargonie, inwersja kontroli jest wzorem, który wspiera, między innymi, zasadę jednej odpowiedzialności.
Aby dowiedzieć się, dlaczego to wszystko przydaje się, potrzebujesz eksponatu, więc musisz ze mną.
Jedna odpowiedzialność oznacza w zasadzie, że twoja klasa powinna być tak niezależna od innych części systemu, jak to możliwe, aby zminimalizować wpływ zmiany jednej części na drugą. (Możesz również powiązać to z faktem, że zmiana implementacji nie powinna powodować rekompilacji wszystkich plików w twoich projektach, tak jak w przypadku zmiany plików .h w projekcie C/C++ na przykład). Efektem ubocznym jest to, że kończy się wiele małych obiektów, które wykonują tylko jedną rzecz, ale bardzo dobrze (w idealnym świecie)
Jednak w większości przypadków, aby wykonać swoją pracę, jeden obiekt musi rozmawiać inny obiekt: to zależy od nich.
Pierwsza część łagodzenia polegająca na oddzieleniu implementacji od interfejsów. Oznacza to poleganie na interfejsach (lub czysto abstrakcyjnych klasach, w zależności od wybranego języka), aby jeden obiekt nie był powiązany z konkretną implementacją innego.
więc używać kanoniczny przykład na potrzeby warstwy biznesowej, trzeba przeprowadzić funkcję, która potrzebuje dostępu do - warstwa danych odzyskać obiektom - niektóre inne usługi - rejestrator do dziennika informacje i czy błędy
Z kolei każda usługa lub zależność ma swoje własne zależności, o których klasa powinna wiedzieć, nawet jeśli ich nie używa. W zależności od ilości referencji, ustawienie obiektu może szybko wyjść z rąk. Teraz pomnóż to przez liczbę klas, które musisz napisać, a skończysz z bałaganem rzeczy.
Korzystanie z kontenera IOC zasadniczo pomaga pozbyć się tego bałaganu. Gdy potrzebujesz obiektu, nie "go wymyśl". Zamiast tego możesz poprosić kontener IOC, aby go dla Ciebie odebrał. Kontener jest odpowiedzialny za dostarczenie obiektu funkcjonalnego, gotowego do użycia, niezależnie od jego zależności.
Co oznacza, że klasa nie ma potrzeby bycia świadomym zależności klas, na których polega, co zmniejsza plątaninę. Co więcej, nie trzeba wiedzieć, jaka rzeczywista klasa implementuje usługi, na których się opiera, co oznacza, że - Implementacja usługi może być zdefiniowana w innym projekcie (dll lub cokolwiek innego), więc modyfikowanie go nigdy nie wpłynie na ciebie klasa - Implementacja może być inny w zależności od kontekstu (należy pomyśleć o zmianie bazy danych lub nawet przejściu do usługi sieciowej w celu pobrania informacji w zależności od konfiguracji lub nawet aktualnego stanu aplikacji).
Aby spróbować odpowiedzieć na inne pytania, IOC jest wzorem. TDD i DDD są metodami projektowania, dlatego nie można zrównać drugiego. Ale IOC jest nieocenionym narzędziem do obsługi TDD lub DDD.
Wiem, że akronimowa zupa i częściowe próbki, które można znaleźć w pobliżu, nie są łatwe do zdziwienia. Najlepszą radą, jaką mogę ci dać, jest wypróbowanie kilku małych projektów na boku, prototypów, które WYLECIE, aby uzyskać dostęp do tych rzeczy. Nie jest to łatwa droga, jeśli szukasz tego do pracy, ale absolutnie tego wart, choćby z osobistego punktu widzenia.
Mam nadzieję, że trochę pomaga.
MKOl jak w odwrócenie sterowania - The wzorzec projektowania? – dirkgently