Po obejrzeniu tego filmu Greg Yound na DDDJak zaimplementować CQS ze zmianami w pamięci?
http://www.infoq.com/interviews/greg-young-ddd
Zastanawiałem się, w jaki sposób można wdrożyć Rozstanie Command Query (SJK) z DDD kiedy masz w pamięci zmian?
Z CQS masz dwa repozytoria, jeden dla poleceń, drugi dla zapytań. Oprócz dwóch grup obiektów, obiektów poleceń i obiektów zapytania. Obiekty poleceń mają tylko metody i nie mają właściwości, które mogłyby narazić kształt obiektów i nie mogą być używane do wyświetlania danych na ekranie. Obiekty zapytań z drugiej strony służą do wyświetlania danych na ekranie.
W wideo polecenia zawsze trafiają do bazy danych, dzięki czemu można użyć repozytorium kwerend w celu pobrania zaktualizowanych danych i ponownego wyświetlenia na ekranie.
Czy możesz użyć CQS z czymś podobnym i ekranie edycji w ASP.NET, gdzie zmiany są wprowadzane w pamięci i ekran musi być aktualizowany kilka razy ze zmianami zanim zmiany zostaną utrwalone w bazie danych?
Na przykład
- I pobrać obiekt kwerendy z repozytorium zapytań i wyświetli go na ekranie
- klikam edytuj
- I odśwież plik obiektu kwerendy z repozytorium obiektów kwerendy i wyświetlić go na formularz w trybie edycji
- Zmieniam wartość w formularzu, która autopostuje z powrotem i pobiera obiekt polecenia i wydaje odpowiednie polecenie:
- CO ZROBIĆ: Teraz muszę wyświetlić aktualizację ted obiektu, ponieważ polecenie wprowadziło zmiany w polach obliczeniowych. Ponieważ obiekt polecenia nie został zapisany do bazy danych, nie mogę użyć repozytorium zapytań. I z CQS nie mam na celu odsłonięcia kształtu obiektu polecenia do wyświetlenia na ekranie. W jaki sposób odzyskasz obiekt zapytania wraz ze zaktualizowanymi zmianami wyświetlanymi na ekranie.
Kilka możliwych rozwiązań, jakie mogę wymyślić, to posiadanie repozytorium sesji lub sposobu pobrania obiektu zapytania z obiektu polecenia. Czy CQS nie ma zastosowania do tego typu scenariusza?
Wydaje mi się, że w filmach zmiany pojawiają się od razu w bazie danych, a ja nie znalazłem przykładu DDD z CQS, który rozwiązuje kwestię grupowania zmian w obiekcie domeny i aktualizowania widoku zmodyfikowany obiekt domeny przed wydaniem komendy do zapisania obiektu domeny.
Dzięki za odpowiedź. Zastanawiam się, jak powszechny/dobry jest projekt, aby używać CQS, gdy zmiany są w pamięci, a nie trwały prosto do bazy danych? Zasadniczo stworzyliśmy repozytoria sesji, aby umożliwić repozytorium kwerend dostęp do danych poleceń za pośrednictwem zmiennej sesji. Może potrzebujesz później repozytoria HttpContext. Czy ktoś widział to wcześniej? Myśli docenione. – Ian
Moim zdaniem metoda, której używasz do manipulowania źródłem danych, nie powinna opierać się na rodzaju źródła danych. Wzorzec repozytorium pozwala oddzielić te różnice, umożliwiając traktowanie dowolnego źródła danych tak, jakby był zbieralną kolekcją obiektów.Od poszczególnych implementacji repozytoriów zależy określenie docelowego źródła danych - więc teoretycznie masz "InMemoryRepository" i "DatabaseRepository" - lub co ty. –
Tak, rozumiem, że możesz zamienić repozytorium InMemory dla repozytorium bazy danych. Część wartości CQS polega na tym, że wydajesz komendy do bazy danych i osobno wycofujesz zaktualizowane dane do repozytorium zapytań. W pamięci obiekt polecenia znajduje się w sesji, więc repozytorium kwerend może pobierać tylko dane w obiekcie polecenia. Z wersją bazy danych obiekt zapytania może być zupełnie inny niż obiekt polecenia, wydaje się, że z pamięcią CQS relacja jest o wiele bliższa. Zastanawiasz się, jak to pasuje do tego, co CQS próbowało osiągnąć. – Ian