Servizio REST e CQRS

4

Sto lottando con l'architettura per un nuovo progetto. Sto usando i seguenti modelli / tecnologia.

  • CQRS - tutto ciò che sta entrando passa attraverso un comando
  • REST - utilizzando WebAPI
  • MVC - asp.net mvc
  • Angolare - costruzione di una spa
  • NHibernate

Credo che ciò fornisca una grande separazione e dovrebbe aiutare a mantenere un dominio molto complesso dalla crescita in un gigantesco set di servizi che mescola le query con altre logiche di business.

  • I servizi REST sono diventati non riposanti. Stanno mettendo a riposo metodi che sono "SearchByDate", "SearchByItem" ecc.
  • I metodi di servizio che eseguono i comandi vengono chiamati con una classe del modello "web", un nuovo comando viene creato nel servizio ed eseguito, mi sembra che ci sia un sacco di codice in più.

Mi aspettavo che questo fosse molto diverso ma non ero in giro per mantenere le cose in pista.

Finalmente le mie domande sono ...

Mi sarebbe piaciuto vedere PUT Person (CreatePersonCommand) ma poi ho capito che non è riposante o è vero? la put dovrebbe essere un'entità persona non un comando.

Posso far funzionare il servizio CQRS e REST o sto sbagliando tutto questo?

Come faccio a gestire i metodi di servizio che non rientrano in un modello REST. Non sto eseguendo CRUD sull'oggetto ma piuttosto eseguendo alcune logiche di business. OSSIA Non voglio che l'interfaccia utente sia responsabile del modo in cui una spedizione è "non tagliata". Voglio che il livello di servizio si preoccupi di ciò.

    
posta Paul Wade 03.06.2014 - 16:17
fonte

2 risposte

6
  • REST funziona bene con un modello di comando ... i comandi diventano fondamentalmente nomi o risorse di lavoro.

Quindi invece di usare

/blah/blah/SearchByName

Avresti una risorsa "ricerca" (nome)

/blah/blah/search?Name=

Ho sempre pensato che fosse un gioco di parole, ma ha il vantaggio di mantenere orientate le risorse della semantica.

  • Nel caso in cui il verbo rispecchia direttamente un verbo HTTP, basta ometterlo.

Invece di

/blah/blah/CreatePerson

è solo PUT a

/blah/blah/Person

... la chiamata è la stessa, è solo che stai usando il verbo HTTP (PUT) invece di duplicarlo nel nome della risorsa.

  • Inoltre, solo stilisticamente, non penso che sia necessario aggiungere "Command" a tutti gli URI;) È come avere "PersonResource", "CarResource", "CompanyResource", ecc. O come aggiungere " Pagina "a tutti gli URL sul Web: link , link , link

CQRS parla di dividere i tuoi scrittori dai tuoi lettori. Sarebbe equo in CQRS e REST aggiungere alcune risorse che accettano solo POST, utilizzando la clausola "elaborazione dati" per POST fornita nelle specifiche HTTP. Dati POST per l'elaborazione, quindi OTTENERE le risorse risultanti.

Ma fintanto che i nomi delle risorse si riducono a nomi piuttosto che a verbi, puoi mantenere tutti i puristi felici.

...

Un nome comando è solo una combinazione di azione + obiettivo. Stai concatenando quelli per creare i tuoi nomi di comando "ActionTargetCommand".

In REST:

  • il target va nell'URI di base

  • l'azione diventa il metodo o implicita dalla stringa di query

  • e il comando scompare come ridondante

"ACTION htpp: // blah / Target? ActionParameter=".

Devi rendere la tua azione uno dei metodi HTTP, oppure trasformare la risorsa in un nome processore.

Ad un livello, si sta semplicemente cambiando il nome per adattarsi a un paradigma orientato alle risorse, ma a un livello più profondo si tratta di suddividere i comandi in quelli coperti dai metodi HTTP e altri nell'elaborazione dei nomi.     

risposta data 03.06.2014 - 18:52
fonte
0

Probabilmente hai bisogno di Event Sourcing. Fondamentalmente si memorizza ogni evento in qualcosa che assomiglia a una coda seriale e alcuni processi di servizio raccolgono gli eventi in coda e li eseguono. In questo modo puoi separare il codice che invia gli eventi dal codice che esegue i loro effetti. Hai anche il vantaggio di essere in grado di riprodurre gli eventi per ricostituire lo stato dell'oggetto. Ti suggerisco di fare qualche ricerca su google per Event Sourcing. È un compagno comune di CQRS.

    
risposta data 03.06.2014 - 18:15
fonte

Leggi altre domande sui tag