In CQRS, va bene chiamare servizi esterni da Sagas / Process Manager?

1

Nel mio dominio in cui sto applicando CQRS, ci sono alcune chiamate di servizio esterne per alcune convalide. Sono un po 'perplesso su dove mettere queste chiamate. Sto considerando di mettere queste chiamate al mio Process Manager d'altra parte AFAIK, il process manager dovrebbe essere una semplice macchina di stato che reagisce sugli eventi e invia i comandi ad altri aggregati. Posso pensare a due soluzioni:

1-) Una soluzione è effettuare queste chiamate e, in base alla chiamata di servizio, passare a un altro stato pubblicando autonomamente un evento. Anche se non mi piace l'idea che Process manager pubblichi eventi.

2-) Posso racchiudere le mie chiamate di servizio dietro un'altra interfaccia e la stessa chiamata di servizio può sollevare l'evento. Anche se non mi piace questa idea dal momento che un evento dovrebbe essere persistente prima della pubblicazione.

Come dovrei affrontare questo problema?

    
posta Onur Gumus 26.01.2018 - 16:57
fonte

3 risposte

1

Risposta breve: chiama i servizi esterni dalla Saga ma inverti la dipendenza utilizzando Interface

Diversamente dagli Aggregati, che devono essere puri (non dipendenti da qualsiasi cosa tocchi l'infrastruttura, né astratti nè concreti), Sagas sono modelli di dominio che possono chiamare servizi esterni. Ma poiché appartengono anche al livello Dominio, potrebbero non dipendere dall'infrastruttura. Sei in grado di farlo invertendo la dipendenza , definendo un Interface nel livello Dominio con un'implementazione nell'infrastruttura. In questo modo, il dominio possiede l'interfaccia e non l'infrastruttura.

In altre parole, devi usare un livello di anticorruzione quando comunichi con modelli esterni, e cioè che Interface per.

Btw, in questo modo aumenti la testabilità della Saga, gratuitamente.

1-) One solution is to make these calls and depending on the service call, transition to another state by self publishing an event. Though I don't like the idea Process manager publishes events.

Neanche io, solo gli aggregati dovrebbero generare eventi di dominio.

2-) I can wrap my service calls behind another interface and that service call itself can raise the event. Though I don't like this idea since an event should be persisted before publishing.

Questo sembra strano.

    
risposta data 26.01.2018 - 18:20
fonte
1

Penso che la macchina di stato del gestore dei processi sia la strada da percorrere. Hai 3 stati separati:

  1. Hai un input non convalidato.
  2. Stai aspettando che un processo esterno convalidi l'input.
  3. Hai ricevuto il risultato della convalida.

A mio parere, si adatta perfettamente alla semplice macchina a stati.

Nel mondo reale, ovviamente, l'ultimo stato è diviso in un altro 3:

  • Il risultato della convalida è positivo.
  • Il risultato della convalida è negativo.
  • Il risultato della convalida non è definito, il servizio esterno si è arrestato in modo anomalo.

Questa e qualsiasi logica di riprova, si adatta perfettamente anche a una semplice macchina a stati.

    
risposta data 26.01.2018 - 17:40
fonte
0

I miei Sagas sono la stessa cosa di un Aggregate. Pertanto, quando ho un processo aziendale complesso che richiede diversi passaggi, ognuno dei quali potrebbe richiedere la richiesta di un servizio di terze parti o un'azione umana, questo processo aziendale ha il seguente aspetto:

Ognipassologicoterminaconlapubblicazionediunevento.

Cisono coppia di examples che dimostrano questa tecnica in modo più dettagliato, entrambi basati sul classico Pat Helland 'paper .

    
risposta data 26.01.2018 - 17:46
fonte

Leggi altre domande sui tag