W wyniku poprzedniego posta (Architecture: simple CQS) Zastanawiałem się, jak zbudować prosty system, który będzie wystarczająco elastyczny, aby można go było później rozbudować.Pytanie architektoniczne
Innymi słowy: nie widzę potrzeby pełnego CQRS teraz, ale chcę, aby później łatwo było ewoluować do niego, jeśli to konieczne.
Tak więc zastanawiałem się, jak rozdzielić polecenia od zapytań, ale obie opierają się na tej samej bazie danych.
Część z zapytaniem byłaby łatwa: usługa danych WCF oparta na widokach ułatwiająca wyszukiwanie danych. Nic specjalnego.
Część polecenia jest trudniejsza, a oto pomysł: polecenia są wykonywane w sposób asynchroniczny, więc nie zwracają wyniku. Ale moje kontrolery witryny ASP.NET MVC często potrzebują informacji zwrotnej z polecenia (na przykład, jeśli rejestracja członka zakończyła się powodzeniem lub nie). Jeśli więc kontroler wysyła polecenie, generuje również identyfikator transakcji (identyfikator) przekazywany wraz z właściwościami polecenia. Usługa poleceń otrzymuje to polecenie, umieszcza je w tabeli transakcji w bazie danych z "przetwarzaniem" stanu i jest wykonywane (przy użyciu zasad DDD). Po wykonaniu tabela transakcji jest aktualizowana, dzięki czemu stan staje się "zakończony" lub "nie powiodło się", a inne bardziej szczegółowe informacje, takie jak wygenerowany klucz podstawowy.
Tymczasem witryna korzysta z usługi QueryService do sondowania stanu tej transakcji, dopóki nie otrzyma "zakończone" lub "nie powiodło się", a następnie może kontynuować pracę w oparciu o ten wynik. Jeśli tabela transakcji jest odpytywana, a wynik został "zakończony" lub "nieudany", pozycja zostanie usunięta.
Efektem ubocznym jest to, że nie potrzebuję guidów jako kluczy dla moich jednostek, co jest dobre dla wydajności i wielkości.
W większości przypadków ten mechanizm odpytywania prawdopodobnie nie jest potrzebny, ale jest możliwy w razie potrzeby. Interfejsy są zaprojektowane z myślą o CQS, więc otwarte na przyszłość.
Czy sądzisz o wadach w tym podejściu? Inne pomysły lub sugestie?
Dzięki!
Lud
Dlaczego oddzielasz swój front za pośrednictwem usługi danych WCF? Czy istnieje ku temu szczególny powód, ponieważ na początku chciałbym, aby moje rozwiązanie było tak proste, jak to tylko możliwe. – thekip
+1 za nie przejście do WCF. Pierwsze prawo Fowlera w projektowaniu obiektów rozproszonych: Nie rozpowszechniaj swoich obiektów (z PoEAA) – Deleted
+1 - zgadzam się z @Chris Smith –