PictOgr – cebulka + moje pierwsze DDD.

Udało sięClean Architecture ugotować cebulkę, projekt wygląda znacznie lepiej aniżeli wcześniej. I dodatkowo ma większe możliwości.

Stworzyłem też moje pierwsze DDD (Domain-Driven Design), ostatnio zachorowałem w tym kierunku (tak jak CQRS i Onion), i pragnę zgłębiac temat…

Zmiana architektury na tak wczesnym etapie projektu nie była zbyt bolesna. Tym bardziej, iż CQRS został wyodrębniony wcześniej.

Jest to moje pierwsze praktyczne zetknięcie z Clean Architecture (lamer).

PictOgr obecnie składa się z 7 projektów tak jak to widać na pierwszym zrzucie.

 

 

Zmiany

Onion ArchitectureWydzieliłem warstwę domeny w projekcie Core.

Infrastructure zawiera wykorzystane usług, CQRS, implementacje repozytoriuów, Autofac, DTO, AutoMapper, i inne potrzebne elementy, bardziej szczegółowy wykaz na drugim zrzucie.

GUI aplikacji znajdować się będzie w projekcie MVVM, czyli XAMLe, ViewModele oraz moduły dla Autofaca.

Dodałem też projekt, w którym znajdą się testy integracyjne o nazwie E2E.

 

 

 

Zmiana architektury niesie ze sobą kilka zmian dotyczących mechanizmów działania aplikacji!

 

Użycie eventa do zamykania okien

Na pierwszy ogień, klasa implementująca (IEvent) zdarzenie zamykania aplikacji.

 

Powyższa klasa jest wykorzystywana przez powiązanego Handlera o nazwie ExitApplicationEventHandler.

Jej celem  jest wywołanie przekazanego delegata do zamykania apikacji w metodzie Handle. To spowoduje zamknięcie okienka.

 

Rejestrowanie handlera i przekazanie delegato do zamknięcia okienka.

 

Pozostaje jedynie w odpowiedniej komendzie ExitApplicationHandler wykonać publikacje zdarzenia ExitApplicationEvent do szyny zdarzeń.

Efektem jest zamknięcie wszystkich okienek w których zarejestrowany jest handler ExitApplicationEventHandler (kod wyżej).

 

Wykorzystanie usług w zapytaniach CQRSa

Do przekazywania danych pomiędzy aplikacją, a modelem wykorzystana będzie odrębna klasa określana jako DTO (Data Transfer Object).

Dzięki takiemu odseparowaniu aplikacja nic nie wie o modelu domeny jaki zaimplementujemy w aplikacji.

Dane pomiędzy modelem domeny a klasą DTO muszą być przekazane, i można to zrobić pod górkę poprostu przepisaując właściwości z wykorzystaniem klasy pośredniczącej (np. jakiegoś Adaptera), lub zywkorzytaniem biblioteczki AutoMapper.

 

Poniżej znajduje się konfiguracja AutoMappera dla klas ApplicationInformation <=> ApplicationInformationDto.

Konfiguracje ustawiamy dwu kierunkowo oznacza to iż będzie można mapować dane w obu kierunkach:

ApplicationInformation = ApplicationInformationDto

ApplicationInformationDto = ApplicationInformation

 

Do pobierania danych z domeny użyjemy tym razem usługi, do jej implementacji wykorzytsamy interfejsik IApplicaitonService, zawierający definicję metody pobierania informacji o aplikacji.

 

Interfejs IApplicaitonService, jest zaimplementowany przez poniższą klasę ApplicationService.

W klasie usługi po pobraniu danych z repozytorium odbywa się mapowanie:

return _mapper.Map<ApplicationInformation, ApplicationInformationDto>(applicationInformation);

Efektem jest przeniesienie danych z obiektu domenowego do obiektu DTO.

 

Użycie modelu domeny do pobrania informacji o aplikacji

Pierwszy obiekt w moim modelu domeny. To klasa z informacjami o aplikacji.

Bardzo banalna, różni się w zasadzie od klasy z nią powiązanej (DTO), wykorzystaniem konstruktora i możliwością ustawienia właściwości Version jedynie właśnie z tego konstruktora (lub metod klasy).

 

Jest tutaj też interfejsik z repozytorium pobierania informacji o aplikacji, owe repozytorium będzie implementowane dopiero w warstiwe wyżej (Infrastrukture). Repozytorium jest ściśle związane z modelem ApplicationInformation.

 

Jedna metoda pobierania informacji jest implementowana w klasie repozytorium ApplicationInformationRepository, implementuje ona interfejs z modelu domeny IApplicaitonInformationRepository, i dostarcza informacji o aplikacji.

Na chwilę obecną jest to tylko wersja plikacji, jednak z czasem może ulec rozbudowie o więcej ciekawych infomracji.

To tyle z dużych zmian w projekcie, myślę iż teraz pujdzie już znacznie lepiej (dla oka = GUI).

Zakończenie

Tak wiem jest to prosty przykład, zapewne wogule nie powinno się robić w ten sposób. Jednak się uczę, i taki przykład dostarcza mi dużo doświadczenia.

Dlatego też postanowiłem zrobić to w ten sposób, być może ktoś dzięki temu wpisowi zrozumie coś wiecej…

 

Dziękuję za wytrwałość i zachęcam do komentowania.

 

Jest to post przygotowany na potrzeby konkursu „Daj Się Poznać 2017” organizowanym przez Macieja Aniserowicza.