Kamil Kliczbor @ asptip.net

7Mar/120

Co mają ze sobą wspólnego DIP, IoC, DI ?

DIP

Bohaterami tego wpisu są skróty DIP (Dependency Inversion Principle), IoC (Inversion of Control) oraz DI (Dependency Injection).  DIP jest podejściem stosowanym w nowoczesnym ujęciu programowania zorientowego obiektowo. W internecie aż roi się od różnego opinii i stwierdzeń odnoszących się do tego podejścia, co może wprowadzać lekką konsternację w jego rozumieniu . Wielu programistów (i nie tylko) miesza pojęcia DIP, IoC oraz DI, co sprawia, że nie dokońca zrozumiałe jest jaki problem opisują i jak chcą go chcą rozwiązać. Aby zebrać to wszystko w logiczną całość przedstawię szereg problemów jakie DIP może rozwiązać oraz kiedy i jak je zastosować.

Zacznijmy od pojęcia DIP. Jest ono bardzo ogólne, a wymagania jakie stawia przed oprogramowaniem ujmuje się w dwie reguły:

  • Moduły wysokiego poziomu  nie powinny być zależne od modułów niższego poziomu. Oba poziomy powinny zależeć od abstrakcji.
  • Abstrakcja nie powinna zależeć od szczegółów. Detale powinny zależeć od abstrakcji.

Zasada DIP odnosi się do ogólnego podejścia z jakim mamy doczynienia podczas projektowania oprogramowania. Używając tego określenia nie mówimy o żadnej konkretnej implementacji, a jedynie zgadzamy się z tym, że moduły wyższego poziomu nie powinny zależeć od mudułów niższego poziomu. To co chcemy osiągnąć, to uzyskanie takiego podejścia, w którym zmiany w modułach niższych nie będą miały wplywu na moduły wyższe. Cały czas tutaj nie mówimy nic na temat w jaki sposób to osiągnąć.

Inversion of  control jest pewnego rodzaju paradygmatem, który umożliwia realizację DIP. Ale samo w sobie IoC nie zapewnia konkretnej implementacji. IoC  można podzielić na grupy implementacyjne :

  • Interface inversion
  • Flow inversion
  • Dependency creation / Binding inversion.

Z kolei, Dependency Creation może być realizowana przez następujące wzorce:

  • Factory Pattern
  • Service Locator
  • Dependancy injection

I teraz jedną z implementacji Dependancy creation może być Dependancy Injection. Jak widzimy ID nie jest jedyną formą realizacji IoC.

Aby zebrać to wszystko razem w jedną całość zależności te można przedstawić schematycznie w postaci następującego rysunku:

Kilka przydatnych linków

http://pl.wikipedia.org/wiki/Odwr%C3%B3cenie_sterowania

http://pl.wikipedia.org/wiki/Wstrzykiwanie_zale%C5%BCno%C5%9Bci

http://martinfowler.com/articles/injection.html#UsingAServiceLocator

http://en.wikipedia.org/wiki/Dependency_inversion_principle

http://martinfowler.com/bliki/InversionOfControl.html

http://msdn.microsoft.com/en-us/library/ff648968.aspx

http://msdn.microsoft.com/en-us/library/dd458907.aspx

http://msdn.microsoft.com/en-us/library/dd458879.aspx