2009-09-25 12 views
6

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

  1. I pobrać obiekt kwerendy z repozytorium zapytań i wyświetli go na ekranie
  2. klikam edytuj
  3. I odśwież plik obiektu kwerendy z repozytorium obiektów kwerendy i wyświetlić go na formularz w trybie edycji
  4. Zmieniam wartość w formularzu, która autopostuje z powrotem i pobiera obiekt polecenia i wydaje odpowiednie polecenie:
  5. 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.

Odpowiedz

1

Jeśli naprawdę chcesz użyć CQS do tego, powiedziałbym, że zarówno Query repo, jak i Write repo mają odniesienie do tego samego magazynu kopii zapasowych.Zwykle to odniesienie jest przez zewnętrzną bazę danych - ale w twoim przypadku może to być lista lub podobna.

+1

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

+0

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. –

+0

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

0

W pamięci zwykle korzystasz z Observer design pattern.

W rzeczywistości zawsze chcesz użyć tego wzorca, ale większość baz danych nie oferuje skutecznego sposobu wywoływania metody w aplikacji, gdy coś w DB zmienia się.

+0

Nie wiem, czy masz moje pytanie. W CQS oddzielasz odczyty z zapisów. Gdzie repozytorium kwerendy jest oddzielone od repozytorium zapisu. Więc jeśli nie zapisuję encji domeny w repozytorium, w jaki sposób repozytorium kwerendy może pobrać dane? Czy potrzebuję sposobu, aby uzyskać obiekt zapytania z obiektu domeny z jego zaktualizowanym stanem, czy też chcesz, aby obiekt zapytania obserwował obiekt domeny i sam się aktualizował? A może ewentualnie wprowadzić repozytorium sesji? – Ian

0

Wzorzec projektu Unit of Work z Patterns of Enterprise Application Architecture bardzo dobrze pasuje do CQS - w zasadzie jest to duża komenda, która utrzymuje w bazie dane.

+0

Dzięki za link, ale wciąż nie odpowiada na moje pytanie. Zasadniczo z CQS mamy jeden obiekt, który ma tylko metody (polecenia) i inny obiekt, który zawiera kształt obiektu. Istnieją dwa repozytoria: jeden dla obiektu polecenia i jeden dla obiektu zapytania. Nigdy nie używasz obiektu komendy do ponownego wypełnienia ekranu, zamiast tego używasz obiektu zapytania. Bez zapisywania zmian w obiekcie komend do bazy danych, w jaki sposób można ponownie wyświetlać zmiany wprowadzone przez wywoływanie poleceń? Ponieważ zmian nie ma w bazie danych, nie można użyć repozytorium zapytań. – Ian

3

Więc brzmi to, jak chcesz tutaj, to bardziej szczegółowe polecenie.

EG: użytkownik wchodzi w interakcję ze stroną internetową (załóżmy, że wypisuje się z koszykiem na zakupy).

Wiele stron pobierających informacje tworzy polecenie. Polecenie nie jest wysyłane, dopóki użytkownik nie sprawdza, gdzie wszystkie informacje są wysyłane w jednym poleceniu do domeny, nazwijmy to poleceniem "CheckOut".

Modele prezentacyjne są bardzo pomocne przy abstrahowaniu tego typu interakcji.

Mam nadzieję, że to pomoże.

Greg

+0

Witaj Greg, czy masz tego przykłady? W tej chwili przeszedłem na trasę przejęcia obiektu zapytania i umieszczenia go w obiekcie "koszyk na zakupy", który serializuje obiekt zapytania w celu umożliwienia zmian między odesłaniami zwrotnymi (może również użyć sesji). Po zakończeniu aktualizacji obiektu jest przekazywana do obiektu polecenia. Gdybym miał więcej czasu, mógłbym użyć innego obiektu niż obiekt zapytania do przechowywania tych zmian w edycji, takich jak model prezentacji. Używam tego samego obiektu do wyświetlania i edycji, czy to samo dotyczy proponowanego modelu prezentacji? Dziękuję – Ian

1

także dla reszty swoimi obawami ...

Są bardziej więc obawy o ewentualną konsystencję w przeciwieństwie do CQRS. Nie musisz być ostatecznie zgodny z CQRS, możesz sprawić, że przetwarzanie polecenia będzie również zapisywać w magazynie raportowania (lub używać tego samego magazynu fizycznego dla obu, jak wspomniano) w spójny sposób. Właściwie polecam ludziom, aby robili to jako swoją podstawową architekturę, a później przyjdą i wprowadzą ostateczną spójność tam, gdzie jest to potrzebne, ponieważ są związane z nią koszty.

+0

Nie wiem, czy to dotyczy mojej sytuacji, jak dotąd tylko jedna baza danych, więc nie musisz się martwić o aktualizowanie magazynu raportowania, a obiekty poleceń korzystają z NHibernate, więc zmiany są zachowywane z powrotem do bazy danych. Czy to dotyczy mojej sytuacji? Nie masz pewności, do którego z nich się odnosisz? – Ian

Powiązane problemy