Ostatnie

28 marca 2025

marca 28, 2025

Prism 9.0 - Subskrybowanie wątku interfejsu użytkownika


Subskrybowanie wątku interfejsu użytkownika
Wprowadzenie

Tworzenie aplikacji na Windows (np. za pomocą WPF) nie jest prostym zadaniem, zwłaszcza gdy trzeba zadbać o to, żeby wszystko działało płynnie i bez problemów. Jednym z głównych wyzwań jest to, by aplikacja reagowała na akcje użytkownika, nie zawieszając się przy tym podczas przetwarzania danych w tle (np. pobieranie plików z internetu czy obliczenia). I tu z pomocą przychodzi framework Prism 9.0. Prism umożliwia wygodne zarządzanie komunikacją między różnymi częściami aplikacji wykorzystując wzorzec model-view-viewmodel, co pozwala na sprawne działanie programu. A jednym z kluczowych mechanizmów jest tzw. „subskrybowanie” wątku, który odpowiada za interfejs użytkownika.

Co to jest wątek interfejsu użytkownika?

W skrócie – wątek interfejsu użytkownika (UI thread) to ten, który odpowiada za to, co widzimy na ekranie. Kiedy klikamy przycisk czy wprowadzamy dane, to właśnie ten wątek obsługuje nasze działania. Jednak, gdy aplikacja musi wykonać coś w tle (np. pobrać dane z internetu), robimy to w osobnym wątku, żeby nie blokować interfejsu użytkownika. Problem pojawia się, gdy operacje wykonane w tle muszą zaktualizować coś na ekranie. Tego nie możemy zrobić w tle – musi to być wykonane właśnie na głównym wątku UI. Prism 9.0 pomaga w prosty sposób synchronizować te różne wątki, dzięki czemu nasza aplikacja działa płynnie i bez problemów.

Jak działa subskrybowanie wątku UI w Prism 9.0?

W Prism 9.0 mamy dwa główne narzędzia, które pomagają w tej synchronizacji: EventAggregator i DelegateCommand.

  1. EventAggregator – to jak taki komunikator, który pozwala różnym częściom aplikacji wymieniać się wiadomościami. Na przykład, kiedy operacja w tle kończy się, musimy wysłać informację do wątku interfejsu użytkownika, żeby ten zaktualizował widok. EventAggregator pozwala na „subskrypcję” takich wiadomości, dzięki czemu kiedy coś się wydarzy w tle, wątek UI otrzyma odpowiedni sygnał i odpowiednio zareaguje.

  2. DelegateCommand – to narzędzie, które pozwala połączyć akcje użytkownika (np. kliknięcie przycisku) z odpowiednią funkcją w aplikacji. Dzięki niemu możemy upewnić się, że te akcje będą wykonywane bezpiecznie na głównym wątku interfejsu, co jest ważne, żeby nie wprowadzić błędów podczas aktualizacji widoku.

Przykład – jak to działa w praktyce?

Załóżmy, że mamy aplikację, która pobiera dane z internetu. Po zakończeniu pobierania danych musimy wyświetlić wynik użytkownikowi. Cała operacja pobierania danych jest wykonywana na osobnym wątku roboczym, ale wynik tej operacji musimy pokazać na ekranie, czyli na wątku UI. Prism 9.0 pomoże nam łatwo przekazać wynik z wątku roboczego do głównego wątku UI, by wyświetlić go użytkownikowi.

Oto przykład kodu C Sharp:

public class MyViewModel
{
    private readonly IEventAggregator _eventAggregator;
    
    public MyViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.GetEvent<MyOperationCompletedEvent>().Subscribe(OnOperationCompleted, ThreadOption.PublisherThread);
    }

    private void OnOperationCompleted(OperationResult result)
    {
        // Tutaj zaktualizujemy widok na wątku UI
        // Pokażemy wynik operacji
    }
}

W tym przykładzie MyOperationCompletedEvent to zdarzenie, które uruchamia się, kiedy operacja kończy się w tle. Dzięki opcji ThreadOption.PublisherThread mamy pewność, że metoda OnOperationCompleted wykona się na głównym wątku UI, co pozwala bezpiecznie zaktualizować widok.

Dlaczego warto korzystać z subskrypcji wątku UI w Prism 9.0?

  1. Lepsza wydajność – Operacje w tle mogą być wykonywane równolegle, co sprawia, że aplikacja działa szybciej i nie „zamarza”. Użytkownik może korzystać z aplikacji, podczas gdy wykonują się zadania w tle.

  2. Bezpieczniejsze synchronizowanie – Dzięki Prism 9.0 mamy pewność, że zmiany w interfejsie użytkownika będą robione w odpowiednim wątku, co zapobiega błędom, które mogą się zdarzyć, gdybyśmy próbowali zmieniać coś na UI z wątku roboczego.

  3. Łatwiejsza implementacja – Zamiast pisać skomplikowany kod, który obsługuje synchronizację wątków, Prism 9.0 daje proste narzędzia, które załatwiają to za nas.

Podsumowanie

Subskrybowanie wątku interfejsu użytkownika w Prism 9.0 to naprawdę przydatna funkcja, która sprawia, że aplikacja działa płynnie i niezawodnie. Dzięki narzędziom takim jak EventAggregator i DelegateCommand, programiści mogą łatwo zarządzać tym, jak komunikować różne części aplikacji, a także jak synchronizować operacje w tle z interfejsem użytkownika. To sprawia, że aplikacje są bardziej responsywne, bezpieczne i łatwiejsze do utrzymania. Jeśli tworzysz aplikację WPF, Prism 9.0 to świetny wybór, który zaoszczędzi ci sporo czasu i nerwów.

marca 28, 2025

Prism 9.0 – Anulowanie subskrypcji wydarzenia


Anulowanie subskrypcji wydarzenia
Prism 9.0 – Jak anulować subskrypcję wydarzenia

W aplikacjach WPF (Windows Presentation Foundation) zdarzenia są jak skrzynki pocztowe, do których różne części aplikacji mogą wysyłać i odbierać wiadomości. Framework Prism pomaga ogarniać tę komunikację, ułatwiając zarządzanie zdarzeniami. Jednak jedno z ważniejszych wyzwań, z którym spotykają się programiści, to zapomnienie o anulowaniu subskrypcji tych zdarzeń, co może prowadzić do problemów z pamięcią i wydajnością. W tym artykule pokażę, jak działa anulowanie subskrypcji w Prism 9.0 i dlaczego warto się tym zająć.

Co to jest Prism?

Prism to framework, który pomaga w budowie aplikacji WPF w sposób bardziej uporządkowany. Framework zawiera również mechanizm MVVM, czyli implementuje wzorzec programistyczny Model-View-ViewModel, który dodatkowo porządkuje strukturę aplikacji. Dzięki niemu łatwiej zarządzać zależnościami między różnymi komponentami i umożliwia prostą komunikację między nimi za pomocą zdarzeń. Głównym narzędziem do zarządzania tymi zdarzeniami jest EventAggregator. Dzięki niemu różne części aplikacji mogą "rozmawiać" ze sobą bez konieczności bycia bezpośrednio połączonymi. To sprawia, że kod jest czystszy i łatwiejszy w utrzymaniu.

Po co anulować subskrypcję?

W każdej aplikacji, która korzysta z systemu zdarzeń, subskrybujesz zdarzenia, żeby móc na nie reagować. Na przykład, kiedy użytkownik kliknie przycisk, Twoja aplikacja może wysłać zdarzenie, a inne części aplikacji subskrybują je, żeby zareagować w odpowiedni sposób.

Ale co się dzieje, kiedy nie anulujesz subskrypcji? Otóż, jeśli subskrypcja pozostaje aktywna, Twoja aplikacja może niepotrzebnie zużywać pamięć i zasoby, bo trzyma odniesienia do obiektów, które już dawno nie są potrzebne. To nazywamy wyciekiem pamięci, a efektem może być spadek wydajności aplikacji. Dlatego warto pamiętać o anulowaniu subskrypcji, gdy już nie są potrzebne.

Jak anulować subskrypcję w Prism 9.0?

Prism 9.0 ułatwia życie programistom, oferując prosty sposób anulowania subskrypcji. Kiedy subskrybujesz zdarzenie, otrzymujesz specjalny obiekt – SubscriptionToken. To coś w rodzaju "klucza", który pozwala na późniejsze anulowanie tej subskrypcji, gdy już nie będzie potrzebna.

Zobaczmy to w akcji C Sharp:

var token = eventAggregator.GetEvent<MyEvent>().Subscribe(OnEventReceived);

// Anulowanie subskrypcji
eventAggregator.GetEvent<MyEvent>().Unsubscribe(token);

Proste, prawda? Subskrybujesz zdarzenie, dostajesz token, a potem wywołujesz Unsubscribe, żeby usunąć subskrypcję. Dzięki temu unikasz problemów z pamięcią i zapewniasz, że aplikacja nie będzie robić czegoś, czego już nie potrzebujesz.

Korzyści z anulowania subskrypcji

Prawidłowe anulowanie subskrypcji daje kilka naprawdę fajnych korzyści:

  1. Mniej pamięci – Kiedy anulujesz subskrypcję, aplikacja przestaje trzymać w pamięci niepotrzebne dane, co pomaga w oszczędzaniu zasobów i utrzymaniu szybkości aplikacji.

  2. Brak wycieków pamięci – Niezakończone subskrypcje to potencjalne wycieki pamięci, bo obiekty, które już nie są potrzebne, wciąż zajmują miejsce w pamięci. Anulowanie subskrypcji temu zapobiega.

  3. Lepsza wydajność – Kiedy subskrypcje są aktywne, aplikacja ma więcej pracy przy obsłudze zdarzeń. Jeśli anulujesz subskrypcje, zmniejszasz obciążenie systemu.

  4. Stabilność – Aplikacja jest stabilniejsza, bo nie zostają w niej martwe subskrypcje, które mogą prowadzić do dziwnych błędów i problemów z pamięcią.

Jak zarządzać subskrypcjami w praktyce?

Zarządzanie subskrypcjami to nie tylko kwestia anulowania ich, ale też odpowiedniego planowania. Oto kilka rzeczy, na które warto zwrócić uwagę:

  1. Anuluj subskrypcje, kiedy już nie są potrzebne – Jeśli skończysz pracę z jakimś zdarzeniem, natychmiast anuluj subskrypcję. Warto to robić na przykład w metodzie OnDispose w komponentach, które się usuwają.

  2. Subskrypcje jednorazowe – Jeśli subskrybujesz zdarzenie tylko po to, żeby zareagować na coś raz (np. na starcie aplikacji), upewnij się, że subskrypcja automatycznie się anuluje po pierwszym wywołaniu.

  3. Dobre zarządzanie cyklem życia – Subskrypcje powinny być aktywne tylko wtedy, kiedy rzeczywiście ich potrzebujesz. Jeśli coś przestaje być używane, anuluj subskrypcję, żeby zaoszczędzić zasoby.

Podsumowanie

Anulowanie subskrypcji w Prism 9.0 to ważna rzecz, którą warto robić, żeby uniknąć problemów z pamięcią i wydajnością. Framework daje nam do ręki prosty sposób, by dbać o to, żeby nasza aplikacja nie trzymała w pamięci niepotrzebnych subskrypcji. Dzięki temu aplikacja będzie działała szybciej, stabilniej i łatwiej ją będzie utrzymać w dłuższym okresie. Pamiętaj więc, żeby w odpowiednim momencie anulować subskrypcje, a Twoja aplikacja na pewno Ci za to podziękuje!

marca 28, 2025

Prism 9.0 - Subskrybowanie z wykorzystaniem silnych odniesień


Subskrybowanie z wykorzystaniem silnych odniesień
Prism 9.0 to nowa wersja naszego ulubionego frameworka do WPF, który przychodzi z kilkoma ciekawymi zmianami. Jedną z ważniejszych rzeczy jest wprowadzenie obsługi subskrypcji z wykorzystaniem silnych odniesień (strong references). Brzmi to trochę technicznie, ale zaraz wyjaśnię, o co chodzi i jak to wpływa na naszą pracę.

Co to w ogóle jest ta subskrypcja?

Żeby zrozumieć, o co chodzi, musimy zacząć od podstaw. W aplikacjach MVVM (Model-View-ViewModel) mamy model, widok i widok-model, które muszą jakoś ze sobą komunikować. Kiedy coś w modelu się zmienia, widok musi się o tym dowiedzieć i zaktualizować interfejs. Do tego służy właśnie subskrypcja – to taki mechanizm nasłuchiwania na zmiany, który pozwala powiadomić zainteresowane obiekty, że coś się zmieniło.

Prism świetnie wspiera tę komunikację dzięki takim mechanizmom jak EventAggregator czy Messenger, które pozwalają na łatwe subskrybowanie i wysyłanie wiadomości między różnymi częściami aplikacji.

Co to znaczy silne odniesienia?

W starszych wersjach Prism mieliśmy do czynienia z tzw. słabymi odniesieniami (weak references). To oznaczało, że obiekty subskrybujące były trzymane w pamięci tylko do momentu, gdy były aktywnie potrzebne. Jeśli obiekt przestawał być potrzebny (np. widok przestawał subskrybować), to był automatycznie usuwany z pamięci, żeby nie powodować wycieków. W teorii świetne rozwiązanie, ale w praktyce czasami pojawiały się problemy – obiekt mógł zostać usunięty z pamięci zanim zdążył odpowiednio zareagować na zmianę.

No i teraz mamy Prism 9.0, gdzie zamiast słabych odniesień wprowadzono silne odniesienia. W skrócie oznacza to, że obiekt subskrybujący (np. widok) jest trzymany w pamięci przez cały czas, jak jest subskrybentem. Dopóki subskrypcja trwa, nie zostanie usunięty. Dzięki temu masz pewność, że obiekt nie zniknie, zanim będzie miał szansę zareagować na zmiany.

Po co to komu?

  1. Większa pewność i stabilność – Dzięki silnym odniesieniom wiesz, że subskrybent będzie w pamięci tak długo, jak tego chcesz. Nie musisz się martwić, że obiekt zniknie w nieodpowiednim momencie, co mogłoby prowadzić do dziwnych bugów.

  2. Lepsza kontrola nad pamięcią – Teraz masz pełną kontrolę nad cyklem życia obiektu subskrybującego. Jeśli widok przestaje być potrzebny, to możesz sam zdecydować, kiedy go wyrzucić. A to bardzo przydatne w większych aplikacjach.

  3. Mniejsze ryzyko wycieków pamięci – Dzięki temu, że obiekty są trzymane w pamięci tak długo, jak trzeba, nie musisz się martwić, że zapomnisz o jakimś obiekcie i będzie on niepotrzebnie trzymany w pamięci.

  4. Łatwiejsza integracja – Prism 9.0 z silnymi odniesieniami jest bardziej kompatybilny z innymi bibliotekami i frameworkami, co w dużych projektach, gdzie integrujemy różne technologie, jest bardzo przydatne.

A jakie są minusy?

Jasne, silne odniesienia to nie jest rozwiązanie bez wad. Główne ryzyko to to, że obiekty będą trzymane w pamięci dłużej, co w większych aplikacjach może prowadzić do problemów z zarządzaniem pamięcią. Jeśli nie będziesz dbał o czyszczenie subskrypcji, to może się zdarzyć, że obiekty będą zalegać w pamięci i w końcu prowadzić do wycieków.

Na szczęście Prism 9.0 daje ci narzędzia, żeby zarządzać subskrypcjami w sposób odpowiedzialny. Jak nie zapomnisz o usuwaniu niepotrzebnych subskrypcji, to nie ma problemu.

Podsumowanie

Prism 9.0 z silnymi odniesieniami to krok w stronę większej stabilności i łatwiejszego zarządzania pamięcią w aplikacjach WPF. Subskrypcje, które teraz opierają się na silnych odniesieniach, dają większą kontrolę nad tym, jak długo obiekty subskrybujące są trzymane w pamięci, co sprawia, że aplikacje działają stabilniej i szybciej. Oczywiście, wymaga to od programisty trochę większej uwagi, żeby pamiętać o czyszczeniu subskrypcji, ale korzyści z tego rozwiązania zdecydowanie przewyższają ryzyko. To krok w stronę bardziej niezawodnych aplikacji, ajęzyk C Sharp napewno sprawi że tworzenie aplikacji będzie przyjemniejsze.

marca 28, 2025

Prism 9.0 - Filtrowanie subskrypcji (IEventAggregator)


Filtrowanie subskrypcji - IEventAggregator

Tworzenie aplikacji WPF bywa czasem jak zarządzanie chaotycznym ekosystemem – masz mnóstwo komponentów, które muszą wymieniać się informacjami, ale nie chcesz, żeby wszystko zawsze trafiało do wszystkich. I tu wchodzi Prism – biblioteka, która pomaga trzymać porządek w tym całym zamieszaniu, umożliwiając łatwiejsze zarządzanie komunikacją między różnymi częściami aplikacji. Kluczowym narzędziem w Prism jest IEventAggregator, który pozwala na publikowanie i subskrybowanie zdarzeń. Ale jak to bywa w życiu programisty, czasem proste rozwiązania mają swoje wady – na przykład nadmiar subskrypcji, które mogą niepotrzebnie obciążać naszą aplikację. Tu na scenę wkracza nowość w Prism 9.0filtrowanie subskrypcji.

Co to w ogóle jest ten IEventAggregator?

Na początek przypomnijmy, czym w ogóle jest IEventAggregator. To taki pośrednik, który umożliwia komunikację między różnymi elementami aplikacji. Zamiast każdemu komponentowi (na przykład widokom) mówić, co ma robić, wystarczy, że „publikujesz” zdarzenie, a subskrybenci, którzy się na nie zapisali, je otrzymują i mogą na nie zareagować. To bardzo wygodne, bo pozwala uniknąć ścisłych zależności między komponentami. Zamiast tworzyć miliony powiązań między widokami a modelami, używasz pośrednika (czyli IEventAggregator), który zarządza wszystkim za ciebie.

Problem: Za dużo subskrypcji

Załóżmy, że masz dużą aplikację, która ma mnóstwo widoków, które subskrybują te same zdarzenia. Bez filtrowania, każda subskrypcja otrzyma każde zdarzenie, które zostanie opublikowane, co może prowadzić do problemów z wydajnością. Zamiast tylko niektóre widoki reagujące na zdarzenie, wszystkie je dostaną, nawet jeśli w ogóle ich to nie interesuje.

Co gorsza, niektóre subskrypcje mogą nie być potrzebne w danym momencie, a mimo to aplikacja będzie je przetwarzać. To jak z niepotrzebnym kodem, który się ciągle uruchamia i zżera zasoby – nikomu to nie jest potrzebne, ale dzieje się.

Filtrowanie subskrypcji – nowość w Prism 9.0

I tu wchodzi filtrowanie subskrypcji w Prism 9.0. To coś, co pozwala ci bardziej precyzyjnie określić, które subskrypcje mają reagować na konkretne zdarzenie. Dzięki temu możesz ustawić, że zdarzenie nie będzie trafiać do każdego widoku, ale tylko do tych, które spełniają określone warunki. Na przykład, możesz ustawić, że tylko widok dla administratorów będzie reagować na zmiany danych użytkownika, a inne widoki to zignorują. Pamiętaj, że całą aplikację najlepiej tworzyć, używając wzorca MVVM.

Zamiast przyjmować wszystkie zdarzenia na raz, możesz wybrać tylko te, które naprawdę cię interesują. To jak filtrowanie spamu – dostajesz tylko to, co istotne, reszta jest odrzucana.

Jak to działa w praktyce?

Załóżmy, że mamy aplikację, która reaguje na zmiany danych użytkowników. W klasycznym podejściu każda subskrypcja dostaje wszystkie zmiany, ale w wersji z filtrowaniem możemy określić, że tylko użytkownicy z rolą „admin” będą dostawać te zmiany.

Przykład kodu C Sharp:

public class UserEvent : PubSubEvent<User>
{
}

public class AdminUserSubscriber
{
    private readonly IEventAggregator _eventAggregator;

    public AdminUserSubscriber(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.GetEvent<UserEvent>()
            .Subscribe(OnUserChanged, ThreadOption.PublisherThread, false, user => user.Role == "Admin");
    }

    private void OnUserChanged(User user)
    {
        // Logika obsługi zmiany użytkownika z roli Admin
    }
}

W tym przypadku subskrybent AdminUserSubscriber subskrybuje zdarzenie UserEvent, ale tylko jeśli użytkownik ma rolę „Admin”. Dzięki temu inne komponenty, które nie są zainteresowane tymi danymi, nie muszą się z nimi męczyć. Proste, prawda?

Korzyści z filtrowania subskrypcji

Wprowadzenie filtrowania subskrypcji w Prism 9.0 ma kilka świetnych zalet:

  1. Lepsza wydajność – ponieważ tylko te subskrypcje, które naprawdę tego potrzebują, dostają dane zdarzenie. Zmniejsza to niepotrzebne obciążenie i przyspiesza aplikację.

  2. Większa kontrola – masz pełną kontrolę nad tym, które widoki i komponenty dostają zdarzenia. Możesz je dopasować do konkretnego kontekstu.

  3. Łatwiejsze zarządzanie kodem – mniej subskrypcji i bardziej precyzyjne filtry sprawiają, że kod jest bardziej przejrzysty i łatwiejszy do utrzymania, zwłaszcza w dużych aplikacjach.

Podsumowanie

Filtrowanie subskrypcji w Prism 9.0 to mega ułatwienie, jeśli chodzi o zarządzanie komunikacją między komponentami aplikacji. Dzięki temu masz pełną kontrolę nad tym, które komponenty reagują na dane zdarzenia, a Twoja aplikacja staje się bardziej wydajna. Warto wykorzystać tę funkcję, zwłaszcza w większych projektach, gdzie komunikacja między różnymi częściami aplikacji może łatwo wymknąć się spod kontroli. Filtrowanie to coś, co na pewno warto dodać do swojego arsenału, żeby aplikacja była szybka i łatwa do utrzymania.

20 marca 2025

marca 20, 2025

Przesyłanie sygnałów w Prism 9.0 i WPF

Przesyłanie sygnałów w Prism 9.0 i WPF
Aplikacje desktopowe w WPF mogą być naprawdę fajne, ale kiedy zaczynasz je rozbudowywać, problem z komunikacją między różnymi częściami aplikacji staje się dość oczywisty. Chcesz, żeby różne komponenty wiedziały, co się dzieje w innych częściach aplikacji, ale nie zawsze chcesz, żeby były ze sobą ściśle powiązane. I tu wkracza Prism 9.0, które rozwiązuje ten problem, ułatwiając przesyłanie sygnałów między widokami, modelami i innymi elementami aplikacji bez zbędnego zamieszania.

1. Czym jest Prism 9.0?

Na początku warto wyjaśnić, co to w ogóle jest Prism. W skrócie: to taki framework, który pomaga ogarnąć chaos w aplikacjach WPF, gdy masz do czynienia z dużą liczbą komponentów. Działa na zasadzie MVVM (Model-View-ViewModel), co oznacza, że oddzielasz logikę aplikacji (model) od jej wyglądu (widok). Dzięki temu aplikacja jest czystsza, łatwiejsza do testowania i rozwijania.

Prism 9.0 dodaje do tego wszystkie bajery, które sprawiają, że aplikacja staje się bardziej modularna, elastyczna i łatwiejsza do utrzymania. No i daje Ci świetne narzędzie do komunikacji między różnymi kawałkami aplikacji, które wcześniej byłyby zupełnie niezależne. Jak? Dzięki EventAggregator.

2. Dlaczego musimy przesyłać sygnały?

Większość aplikacji WPF to coś więcej niż tylko jeden ekran. Masz mnóstwo różnych widoków (ekranów), które muszą się ze sobą komunikować, na przykład wysłać informację, że coś się zmieniło, żeby inne widoki mogły na to zareagować.

Problem pojawia się, gdy masz wiele takich komponentów i każdy z nich jest od siebie niezależny. A mimo to muszą wymieniać informacje, np. po to, żeby zmiana w jednym widoku (np. kliknięcie przycisku) mogła wpłynąć na to, co się dzieje w innym widoku.

Tu wkracza EventAggregator. Dzięki temu narzędziu nie musisz "ciągnąć" całego łańcucha zależności między komponentami. Komponenty mogą wysyłać komunikaty (sygnały), a inne komponenty, które "subskrybują" te sygnały, będą na nie reagować. Zero bezpośrednich powiązań – super elastyczność!

3. Jak działa EventAggregator?

EventAggregator to coś w rodzaju "przekaźnika", który pośredniczy w wymianie sygnałów między komponentami. Kiedy jeden komponent chce wysłać jakąś wiadomość, wysyła ją do EventAggregator, a potem system przekazuje ją do wszystkich innych komponentów, które są zapisane na odbiór tych wiadomości.

To działa jak kanał komunikacji: nie musisz znać innych komponentów, wystarczy, że wiesz, jak się zapisać do tego kanału.

4. Jak to wygląda w kodzie?

Weźmy przykład: masz przycisk, który po kliknięciu ma wysłać jakąś wiadomość do innych komponentów. Właśnie w takim przypadku świetnie sprawdzi się EventAggregator.

  1. Definiujesz komunikat (event) – czyli rodzaj wiadomości, którą chcesz wysłać:

public class MyEvent : PubSubEvent<string> { }

Tego typu komunikat będzie zawierał wiadomość typu string – może to być na przykład tekst do wyświetlenia w innych częściach aplikacji.

  1. Rejestrujesz się do odbioru komunikatu w ViewModelu (czyli tej części, która zarządza logiką aplikacji):

public class MyViewModel
{
    private readonly IEventAggregator _eventAggregator;

    public MyViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.GetEvent<MyEvent>().Subscribe(OnMyEventReceived);
    }

    private void OnMyEventReceived(string message)
    {
        // Kiedy przyjdzie wiadomość, zareagujemy na nią
        Console.WriteLine($"Otrzymano wiadomość: {message}");
    }
}

W tym przypadku, kiedy coś się wydarzy w aplikacji (np. inny komponent wyśle wiadomość), nasz ViewModel zareaguje na nią i wykona jakąś akcję.

  1. Wysyłasz komunikat – na przykład z widoku, po kliknięciu przycisku:

_eventAggregator.GetEvent<MyEvent>().Publish("Nowa wiadomość");

Teraz, po kliknięciu przycisku, wysyłasz komunikat, a inne komponenty, które są zapisane do tego komunikatu, otrzymują go i reagują na niego.

5. Dlaczego warto używać EventAggregator?

Prism i EventAggregator to naprawdę duży skok w porównaniu do klasycznych metod komunikacji między komponentami. Oto kilka powodów, dlaczego warto się na to zdecydować:

Luźne powiązanie komponentów – Twoje komponenty mogą się komunikować bez konieczności "znania się" nawzajem. Dzięki temu aplikacja jest bardziej elastyczna i łatwiejsza w utrzymaniu.

Czysty kod – Ponieważ komunikacja jest niezależna, nie musisz się martwić o skomplikowane zależności między różnymi częściami aplikacji. Łatwiej jest dodawać nowe widoki, modele i inne komponenty.

Elastyczność i skalowalność – Jeśli w przyszłości dodasz nowe funkcje, to nic nie stanie na przeszkodzie, by wszystko działało płynnie. Możesz dodawać nowe komponenty, które będą reagować na te same sygnały, bez grzebania w kodzie innych elementów aplikacji.

Łatwiejsze testowanie – Dzięki luźnemu powiązaniu, testowanie aplikacji staje się prostsze. Możesz testować każdy komponent niezależnie.

6. Podsumowanie

Jeśli chcesz, żeby Twoja aplikacja była bardziej modularna, łatwiejsza do utrzymania i rozwijania, Prism 9.0 i EventAggregator to narzędzia, które warto wdrożyć. Dzięki nim możesz łatwo przesyłać sygnały między różnymi komponentami aplikacji bez zbędnego bałaganu. Komunikacja między widokami i modelami stanie się prostsza, a Twoja aplikacja będzie bardziej elastyczna i gotowa na przyszłe rozszerzenia.

Czy to proste? Pewnie! A przy tym mega efektywne – nie musisz martwić się o skomplikowane powiązania między komponentami, bo EventAggregator załatwia całą komunikację za Ciebie.