2013-04-20 19 views
7

Niedawno starałem się zrozumieć, jaka jest różnica między używaniem" wzornika usług "i korzystaniem z Castle Windsor Znalazłem pewne informacje tu i tam w Internecie i podsumowałem to, czego nauczyłem się dotychczas w an unfinished blog post.Jaka jest różnica między używaniem wzorca lokalizacji usługi a korzystaniem z kontenera Castle Windsor? "

EDYCJA: Do tej pory myślałem, że Dependency Injection to wszystko, co trzeba by zagwarantować separację. Ale wszędzie, gdzie patrzę, widzę pchnięcie w kierunku kontenerów takich jak Castle Windsor, chciałbym jasno zrozumieć powody: Proszę ... Explain this to me like I'm a 6 year old :)

+0

Jakie oprogramowanie wykorzystałeś do swoich diagramów? – devdigital

+1

yUML: http://yuml.me/ –

+2

Próbowałem odpowiedzieć na to pytanie tutaj: http://blog.ploeh.dk/2011/08/25/ServiceLocatorrolesvs.mechanics –

Odpowiedz

17

Zabawne, powinieneś poprosić o wyjaśnienie, jakbyś miał sześć lat; oto explanation like you were five years old :)

wszędzie patrzę widzę impuls w kierunku pojemników, takich jak Zamek Windsor

Szczerze mówiąc, myślę, że powodem tego jest to, że większość ludzi w rzeczywistości nie rozumieją czym jest Dependency Injection, co oznacza, że ​​zamiast uchwycić koncepcję Inversion of Control, szukają zamiennika dla słowa kluczowego new, do którego są już przyzwyczajeni. Następnie znajdują DI Container i (mis) używają go jako Service Locator. Niestety, bardzo łatwo to zrobić.

To jest powód, dla którego w my book wyjaśniam wszystkie koncepcje DI bez łączenia wyjaśnień z jakimkolwiek pojedynczym pojemnikiem DI. To w rzeczywistości większość tej książki.

Lokalizator usług i iniekcja zależności to two fundamentally different attempts at achieving loose coupling. Lokalizator usług ma wiele wad i nie oferuje żadnych korzyści, których nie oferuje również DI. Dlatego uważam, że bezpiecznie można nazwać Service Locator anty-wzorem.

Nie potrzebujesz pojemnika DI, aby użyć DI; w rzeczywistości powiedziałbym, że unless you take a rather sophisticated approach, it's probably better to avoid one.

+0

@MichaelKohne Przepraszamy, teraz to naprawione. –

3

Cóż, lokalizator usług może być po prostu otoką wokół konkretnej inwersji kontenera kontrolnego, takiego jak Castle Windsor. Chodzi o to, że jedynym miejscem, w którym twój kod powinien (najlepiej) odnosić się do kontenera, jest twoje composition root.

Ponieważ odwracanie kontenerów sterujących obsługuje łańcuch zależności, po rozpoznaniu typu root z kontenera zostaną wstrzyknięte wszystkie jego zależności i wszelkie zależne zależności.

Jeśli następnie chcemy tworzyć kolejnych typów w czasie wykonywania, a następnie można użyć fabryk, które mogłyby mieć także odniesienie do kontenera, jeśli chcesz skorzystać z uzależnienia łańcuchowym oferowane przez kontener i odwzorowań kontenerowych interfejsy z implementacjami.

3

Gdy używasz lokalizatora usług, Twój kod wywołuje lokalizator dla usług wszędzie. Kiedy używasz odwrócenia kontroli, istnieje tylko jedno miejsce (root składu), w którym wywołujesz kontener. Reszta aplikacji nie powinna być kontenerem.

+0

Kiedy powiedziałeś "pojemnik świadomy" miałeś na myśli "nieświadomy"? – Charleh

+0

ups "nie powinno być pojemne" :) –

Powiązane problemy