2013-06-04 7 views
6

Odkryłam, że w wielu przypadkach, wydaje się (przynajmniej pozornie) do sensu używać pojedynczych lub klas statycznych modeli w mojej aplikacji WPF MVVM. Głównie dlatego, że większość moich modeli musi być dostępna w całej aplikacji. Tworzenie modeli static pozwala w prosty sposób spełnić to wymaganie.Czy istnieje lepszy sposób niż używanie klas statycznych lub pojedynczych dla MVVM?

A jednak, jestem konflikt, bo wszyscy na planecie wydaje się nienawidzić pojedynczych. Więc zastanawiam się, czy nie jest lepszy sposób, czy też robię coś oczywiście nie tak?

+3

Tworzenie "MODELS" Static? Nie, nie bardzo. Ani trochę. To jest nawet gorsze niż [parsowanie HTML z RegEx] (http://stackoverflow.com/a/1732454/643085) –

+0

Heh. Nie mogłem się oprzeć, widzę. – sircodesalot

+0

Jeśli korzystasz z DI, zamiast uczynić go statycznym, zarejestruj go w kontenerze za pomocą ContainerControlledLifetimeManager. Statyczne, masz większy problem z bezpieczeństwem wątków. –

Odpowiedz

5

Istnieje kilka problemów z pojedynczych. Opiszę je poniżej, a następnie zaproponuję alternatywne rozwiązania. Nie jestem "Nigdy nie używaj singletona, albo jesteś typem kolesia", jak sądzę, że mają swoje zastosowania. Ale te zastosowania są rzadkie.

  1. Bezpieczeństwo nici. Jeśli masz globalny statyczny Singleton, to musi być bezpieczny dla wątków, ponieważ wszystko może uzyskać do niego dostęp w dowolnym momencie. To dodatkowy koszt.

  2. Testowanie jednostek jest trudniejsze w przypadku Singletonów.

  3. Jest to tani zamiennik zmiennych globalnych (to znaczy, że jest to singleton na koniec dnia, chociaż może mieć metody i inne wymyślne rzeczy).

See, to nie tak, że Singleton to „obrzydliwe obrzydliwości” per-se, ale że jest to pierwszy wzorzec projektowy wielu nowych programistów dostać do czynienia i jego wygoda zaciemnia jego pułapek (Wystarczy trzymać jakieś biegi na to i nazwijcie to parowym punkiem).

W twoim przypadku odnosisz się do modeli i zawsze są to "instancje", ponieważ w naturalny sposób odzwierciedlają dane. Być może martwisz się kosztem uzyskania tych instancji. Uwierzcie mi, że powinny być pomijalne (oczywiście w odniesieniu do projektowania dostępu do danych).

więc alternatywy? Przekaż model do miejsc, które tego wymagają. To sprawia, że ​​testowanie jednostek jest łatwiejsze i pozwala wymieniać podstawy tego modelu w rytmie serca. Oznacza to również, że możesz chcieć spojrzeć na interfejsy - oznaczają one kontrakt. Możesz wtedy tworzyć konkretne obiekty, które implementują te interfejsy i voila - Twój kod jest łatwy do testowania jednostkowego i modyfikowalny.

W świecie singleton, pojedyncza zmiana na singleton może całkowicie złamać wszystko w bazie kodu. To nie jest dobra rzecz.

+0

Nice. Powiedziałbym nawet: nigdy nie używaj singletonu, chyba że nie masz innego wyboru. –

2

myślę przyjętego rozwiązania tego problemu jest użycie Dependency Injection. Dzięki wtryskowi zależności możesz zdefiniować swoje modele jako regularne, niestatyczne klasy, a następnie mieć odwrócenie kontenera kontrolnego "wstrzyknąć" instancję modelu, kiedy chcesz.

Jest miły w wpftutorial.net poradnik, który pokazuje jak zrobić zastrzyk w zależności WPF: http://wpftutorial.net/ReferenceArchitecture.html

+0

Interesujące. Nauczyłem się DI kilka tygodni wcześniej. Wygląda na to, że wybiorę to z powrotem. Dzięki. – sircodesalot

2

Jedyna klasa statyczna, której używam, to MessageBroker, ponieważ potrzebuję tej samej instancji w całej aplikacji.

Ale nawet wtedy bardzo możliwe jest użycie Unity (lub innego Injection Injection/Container) do zarządzania instancjami zajęć, których potrzebujesz tylko jeden.

Pozwala to wprowadzić różne wersje w razie potrzeby (nppodczas testów jednostkowych)

Przy okazji: Statyczny to nie to samo co singleton. Ale nie robię tego tutaj. Wystarczy przeszukać stackoverflow, aby uzyskać więcej ciekawych pytań na ten temat: