2011-01-06 10 views
26

Czy ktoś może mi wyjaśnić pojęcie pojemnika jedności, jakbym był 6-letnim dzieckiem? Jak to działa i co robi?WPF/Prism: Co to jest kontener UNITY?

+2

to nie jest tak dużo, że nie jest kontener Unity, ale „Jedność” to nazwa szczególności Dependency Injection (DI) pojemnika. Pryzmat jest również wyposażony w MEF i obsługuje każdy inny kontener DI. Jedność po prostu była pierwsza. Jeśli chcesz przeczytać o różnicy między Unity i MEF, przeczytaj odpowiednią sekcję na http://msdn.microsoft.com/en-us/library/ff921140(v=PandP.40).aspx. – Pat

+0

@Pat, MEF to framework plug-in, a Unity to prawdziwy kontener DI. –

Odpowiedz

47

To jest bardziej techniczny opis tła, mam nadzieję, że nadal będzie on przydatny.

Ogólnie mówiąc, jest to kontener DI (wstrzyknięcie zależności).

Biorąc pod uwagę następujące klasy:

public class Sample 
{ 
    Service a; 

    public Sample() 
    { 
    a = new Service(); 
    } 
} 

Problem z tym jest to, że inicjuje własną wersję Service, co sprawia, że ​​bardzo trudno dostosować do zmian w kodzie (czyli jeśli chcesz wymieniać Service z czymś. różne). Również utrudnia testowanie.

Aby rozwiązać, że w rzeczywistości nie tworzyć go samodzielnie, ale dostać go z zewnątrz:

public class Sample 
{ 
    Service a; 

    public Sample(Service aService) 
    { 
    a = aService; 
    } 
} 

Teraz podjęły stworzenie od klasy można po prostu umieścić go tam z zewnątrz , zwiększając testowalność i łatwość konserwacji. Jednak nadal masz zależność od klasy Service. Nie jesteś zainteresowany tą konkretną klasą, ale zachowaniem, które oferuje - więc robisz to w interfejsie.

public class Sample 
{ 
    IService a; 

    public Sample(IService aService) 
    { 
    a = aService; 
    } 
} 

Teraz możesz zastąpić usługę czymkolwiek chcesz. Na przykład masz klasę pobierania danych z serwera za pomocą usługi. Teraz chcesz przetestować tylko parsowanie danych, a nie pobieranie danych - wystarczy utworzyć klasę implementującą interfejs, obsługującą dane statyczne - gotowe!

Teraz wchodzi w grę Unity. W tej chwili sam musisz rozwiązać te zależności. Co jedność nie jest prosty - trzeba wszystkie klasy, które mają dependendencies i rozwiązuje te - tak można po prostu zadzwoń (pseudokod, nie wiem jedności):

UnityContainer uc = new UnityContainer(); 
var a = uc.GetService<IService>(); 

I robi wam łatwo klasę użytkową.

Co uzyskaliśmy dzięki temu?

  • kod jest bardziej linkujących, ponieważ nie opierają się na konkretnych typach
  • kod jest bardziej sprawdzalne
  • aplikacja jest łatwo rozszerzalny

W skrócie: to pomaga tworzyć lepsze aplikacje szybciej.

+1

Czy usługa otrzymuje instancję po dodaniu do kontenera lub po wywołaniu metody GetService? Jeśli poprosisz o tę samą usługę w dwóch różnych miejscach, ale z tej samej instancji Unity otrzymasz ten sam obiekt lub oddzielne instancje? –

+1

Przykro mi, nie mogę ci tego powiedzieć, nigdy wcześniej nie używałam Jedności. Ogólnie mówiąc, zależy to od implementacji kontenera/frameworka. Zajrzyj do dokumentacji, tam powinien być jej opis. Ponadto niektóre kontenery oferują możliwość zdefiniowania umowy na całe życie, dzięki czemu możesz mieć pojedyncze wystąpienia (zawsze otrzymujesz to samo) lub nowe instancje dla każdego żądania. Jak wspomniano wcześniej, zależy całkowicie od pojemnika. – Femaref

+0

Ok Przeczytałem fragmenty instrukcji Unity i wydaje mi się to bardzo konfigurowalne, więc myślę, że możesz to zrobić, jak chcesz. –

33

Unity Container jest jak słoik pełen ciasteczek, kiedy potrzebujesz ciasteczka, po prostu prosisz słoik o ciasteczko.

Każdy plik cookie jest posiadające niektóre zalety jak można mieć ciastko, ale nie można go jeść, bo jest to bardzo trudne do jedzenia (coś jak Singleton)

kiedy twoja mama tworzy nowy plik cookie, po prostu umieścić ten plik cookie w słoiku, zamiast dawać ci bezpośrednio!

+16

co wydaje się być odpowiedzią 6-latka. :) –

+0

yup;), OP prosi w ten sposób! – TalentTuner

+3

W tej analogii, która odgrywa rolę matki? – atiyar

7

Polecam oglądanie Mike Taulty's Prism video series

Pierwsze dwa rozdziały będzie odpowiedzieć na to pytanie, można oglądać w innych rozdziałach, aby dowiedzieć się Prism (choć jego wersji 2 i dość stare, podstawowe zasady pozostaje taka sama .. .)

Powodzenia :)