Event sourcing: fusione della radice e della proiezione aggregate?

3

Sto cercando di capire come funziona l'architettura basata su eventi.

Dalla mia comprensione, la proiezione è la rappresentazione di uno stato in un dato momento; infatti - è un'aggregazione di eventi che ha portato a quello stato. La proiezione viene archiviata in un archivio dati per finalità di interrogazione.

Dal momento che sia l'aggregato che la proiezione vengono "ricostruiti" dal flusso di eventi, perché non dovrei unirli in un pezzo di codice singolo?

Mi ritroverei con una classe che sarebbe responsabile di:

  • aggiornando lo stato (interno) in base agli eventi applicati
  • creazione di nuovi eventi quando viene chiesto di cambiare il suo stato

Ad esempio: l'ordine del negozio. Supponendo di disporre di un'infrastruttura che memorizza gli eventi e li invia alle proiezioni, quindi memorizza le proiezioni

class Order: Aggregate {
    private Guid _id;
    private OrderState _state;
    private DateTime _dateCreated;
    private List<Item> _items = new List<Item>();

    public Order()
    {
        // used when loading from projection data store (de-serializing from JSON for example)
    }

    public Order(Guid id, IEnumerable<Item> items)
    { 
        // used when handling CreateOrder command,
        // uses Aggregate.PublishEvent which appends the event to the stream
        // the event dispatcher causes the event to be Applied as well
        this.PublishEvent(new OrderCreated(id, items));
    }

    public void Apply(OrderCreated ev) 
    {
        // event applied by event dispatcher, when reconstructing from events
        this._id = ev.Id;
        this._state = OrderState.New;
        this._items = new List<Item>(ev.Items);
    }

    public void Ship()
    {
        // used when handling ShipOrder command
        // incorporates business logic
        if (this._state != OrderState.Shipped)
        {
            this.PublishEvent(new OrderShipped(this._id));
        }
    }
}
    
posta Mike 24.01.2017 - 19:25
fonte

2 risposte

2

Since both the aggregate and the projection are being "rebuilt" from stream of events, why shouldn't I merge them into single code piece?

Perché hanno responsabilità diverse.

L'aggregato governa il modo in cui il flusso di eventi può essere esteso; al suo interno è l'attuale raccolta di regole aziendali che regolano le modifiche a questo flusso.

Ma le proiezioni sono viste che supportano casi di utilizzo di query interessanti. Non hanno alcun interesse per le regole aziendali che governano quali sono i futuri possibili, ma solo per capire come rappresentare il passato.

Vengono acquistati allo stesso modo - e potresti voler utilizzare componenti comuni per estrarre la cronologia dal libro dei record - ma le strutture dati utilizzate per supportare i casi d'uso sono probabilmente diverse.

Ad esempio, se si dispone di un caso d'uso in cui è necessario interrogare le relazioni tra le entità del proprio dominio, è probabile che si desideri eseguire tali query da un database grafico anziché da un archivio eventi. Cavalli per i corsi.

    
risposta data 24.01.2017 - 20:57
fonte
0

Since both the aggregate and the projection are being "rebuilt" from stream of events, why shouldn't I merge them into single code piece?

Poiché parliamo di CQRS, devi per creare (almeno) due oggetti separati:

CQRS is simply the creation of two objects where there was previously only one (Greg Young)

    
risposta data 29.01.2017 - 14:03
fonte

Leggi altre domande sui tag