Witam. Próbuje zaimplementowac CQRS w aplikacji ale bez ES. Korzystając z różnych blogów i przukładów mam command dispatchera który wywołuje odpowiedni command handler (analogicznie dla query ) i co dalej teraz ? Np przed wykonaniem commendy czyli zapisu do bazy chciałbym sprawdzić czy wpis nie koliduje z nnymi ( zakres dat itp ) jakąś klasa typu create validation która pobierze dane z bazy i sprawdzi odpowodnie warunki korzystając np z jakiegoś repository do pobrania ? Ciężko znaleźć konretny przykład. Może ktoś coś podpowie ?
szydlak napisał(a):
przed wykonaniem commendy czyli zapisu do bazy chciałbym sprawdzić czy wpis nie koliduje z nnymi ( zakres dat itp )
W handlerze możesz to sprawdzać. Lub jesli prowadzisz projekt w DDD to w modelu napisac metody sprawdzające.
Tak mi przyszło na myśl, żeby zrobić coś w stylu Chain of responsibility : DbValidation - > DbInsert.
szydlak napisał(a):
Tak mi przyszło na myśl, żeby zrobić coś w stylu Chain of responsibility : DbValidation - > DbInsert.
Jeśli potrzebujesz wzorców z DDD to możesz np zrobić serwis który będzie sprawdzał czy np. tytuł filmu istnieje i korzystać z niego w agregacie. Wydaje mi się, że równie dobrze można by to do reposiotry wpakować, chociaż wersja z agregatem wydaje mi się bardziej czytelna intuicyjna.
Ale jeśli to ma być tylko CRUD, bez "logiki" to po prostu rób to w handlerze bez żadnych nakładek na ORM. Jeśli wiesz, że "encja"(lub tabela) będzie miała tylko kilka operacji to równie dobrze możesz traktować jako handlery metody w serwisie bez dispachera, ale to również kwestia gustu.
Masz dla przykładu moje podejście przy CRUD'zie https://github.com/Ja-rek/CSharp-Example/tree/master/CrudFramework
Jeśli chodzi o ddd to to mam tu braki. Do tej pory robiłem tak , że w kontrolerze miałem serwis np Bookservice który miał wiele różnych metod. Np AddBook RemoveBook itp. No i z czasem ten serwis zaczyna się rozrastac dość mocno i jest tam wszystko praktycznie. Teraz eksperymentuje z podziałem na command oraz query. I command handler uruchamia ciąg operacji. Np najpierw walidacja pol , potem walidacja pod kątem istnienia w bazie np tej samej nazwy. Potem wstawienie rekordu do bazy. I w ten sposób mam każde zadanie w innej klasie (chain of responsibility )