2010-06-03 16 views
21

W najnowszej wersji MVVM oświetleniu (V3 SP1) zarówno "Dispose()" i "Dispose (bool)" metody w klasie ViewModel są oznaczoneCleanup vs Dispose (bool) w MVVM-light

Nie używaj tej metody, zostanie ona usunięta w przyszłej wersji. Zastosowanie ICleanup.Cleanup() zamiast

Czy oznacza to, że interfejs IDisposable nie muszą być realizowane we wszystkich klasach ViewModel, które pochodzą z GalaSoft.MvvmLight.ViewModelBase (i czyszczenia należy overrided)?

Jeśli tak, użycie nie może być użyte dla instancji modelu widoku ... Prawdopodobnie czegoś nie zrozumiałem ... Proszę wyjaśnić ... Jakie są zalety takiego czyszczenia?

Dzięki.

Odpowiedz

27

Kwestia jest historyczna. Najpierw pomyślałem, że dobrym pomysłem byłoby wymuszenie na IDM wszystkich możliwych maszyn wirtualnych. Jednak IDisposable ma inną intencję: Kiedy VM zostanie usunięta, oczekuje się (zgodnie z przyjętą konwencją), że zostanie ona zebrana jak najszybciej. Po rozmowie z przyjaciółmi zdałem sobie sprawę, że zmuszenie wszystkich maszyn wirtualnych do IDisposable było błędem. Właśnie dlatego zastąpiłem IDisposable przez ICleanup. Intencją ICleanup jest zapewnienie sposobu na czyszczenie maszyn wirtualnych (na przykład spłukiwanie ich stanu do trwałego przechowywania, zamykanie strumieni itp.), Ale niekoniecznie w taki sposób, że będą one gromadzone jak najszybciej.

Nic nie stoi na przeszkodzie, aby twoje maszyny wirtualne wdrożyły IDisposable. Po prostu nie chciałem utrzymywać tego ograniczenia w klasie ViewModelBase, dlatego ten interfejs zostanie usunięty w wersji V4.

Zaletą korzystania z funkcji ICleanup jest możliwość czyszczenia wszystkich maszyn wirtualnych w jednym wywołaniu metody ViewModelLocator.Cleanup(). Jest to wskazówka dla programistów VM, którzy twierdzą, że maszyny wirtualne powinny pomyśleć o zapewnieniu metody czyszczenia ich maszyn wirtualnych.

Czy to ma sens? Pozdrawiam, Laurent Laurent

+0

Dziękuję za komentarz, to na pewno zrobić sence, jeśli chcesz mieć realne VM po clening ... Ale nie widzę powodu, aby go oczyścić bez utylizacji. .. Zwykle demontuję maszynę wirtualną po jej zamknięciu ... dlaczego muszę ją wyczyścić bez zamykania? Będę wdzięczny za wszelkie opinie. dzięki jeszcze raz. – Budda

+4

@Budda, o którym wierzę, że LBugnion mówi, że koncepcja, której używał dla IDisposable była już przeładowana ideą GC obiektu tak szybko, jak to możliwe. Jednak wielu z nas używa tego samego obiektu VM w kółko, więc zamiast pozbyć się obiektu ViewModelBase został przekazany interfejs ICleanUp, którego celem jest wyczyszczenie VM Clean, aby można go było ponownie użyć. Może to być przydatne, jeśli robisz pierwsze podejście VM, WPF nie wyrzuci widoku, a potem go odtworzy, zamiast tego zostanie wyczyszczony jak maszyna wirtualna. – Agies

+0

Dzięki. To jasne, teraz – Budda

2

Sądzę, że w tej kwestii mogę nieco różnić się od Laurenta. Ideą IDisposable jest to, że obiekt może mieć pewne porządki, które muszą się odbywać i sam w sobie nie ma nic wspólnego ze zbieraniem śmieci. W rzeczywistości, w większości przypadków IDisposable jest zaimplementowany w celu czyszczenia niezarządzanych zasobów , takich jak uchwyty plików, obiekty sync lub połączenia z bazami danych, które znajdują się poza zakresem GC. Poza tym, tylko dlatego, że klasa podstawowa implementuje IDisposable, nie oznacza, że ​​musi mieć rzeczywistą implementację. To może być relegowane do wirtualnej metody Dispose (bool disposing), która może zostać przesłonięta przez klasy pochodne, aby mogły wykonać czyszczenie.

Kwestia, o której Budda wspomina, polega na tym, że IDisposable jest z założenia jednokierunkową operacją. Po usunięciu obiektu powinien on rzucić obiekt ObjectDisposedException na swoje publiczne metody. Jeśli wszystko, co chcesz zrobić, to przepłukać zasoby, aby móc ponownie użyć obiektu, wtedy metoda czyszczenia ma sens. Jednak niekoniecznie usunę funkcję Dispose, która służy innemu celowi.

+1

Niezarejestrowane zasoby są wymagane do wydania w metodzie Finalize. Możesz również wymusić system, aby zwolnił je podczas usuwania i pomijać finalizację w tym przypadku (zobacz wzór wdrożenia metody "Usuń") – Budda

2

"Interesująca" mała historia: po tym, jak znalazłem programistów w moim zespole, nie anulowałem subskrypcji wydarzeń, "umyłem 'IDisposable w hierarchii modelu widoku tylko po to, aby zmienić zdanie na temat tego, czy Dispose było właściwym miejscem.

W niektórych okolicznościach trudno było wywołać Dispose z powodu MEF i innych funkowych sposobów tworzenia naszych modeli widoków. To sprawiło, że zastanawiałem się, czy to było właściwe.A wtedy nie fakt, że utylizować potrzebuje opieki (a fragment), aby uzyskać prawo:

DG Update: Dispose, Finalization, and Resource Management

Później było trochę pracy weekendu na aplikacji WP7 (gdzie Używam MVVM Light) i zauważyłem zmianę Laurenta serca też.

Uważam, że jest to właściwa decyzja; IDisposable wysyła komunikat, że "klient" powinien spróbować opakować użycie klasy w use() lub w inny sposób umyć ręce instancji ASAP.

Początkowo zgodziłem się z zaakceptowaną odpowiedzią w wątku poniżej, ale potem zacząłem myśleć, że JaredPar miał rację.

Using IDisposable to unsubscribe events

Luke

Powiązane problemy