Event Sourcing command or event from external system?

后端 未结 2 515
被撕碎了的回忆
被撕碎了的回忆 2021-02-08 13:38

In most cases I understand the distinction between a command and an event in a CQRS + ES system. However, there is one situation that I can\'t figure out.

Suppose I am b

2条回答
  •  被撕碎了的回忆
    2021-02-08 14:28

    I found this question while wondering the same thing.

    I liked Mikael's answer and upvoted it. However, I found another answer on the DDD/CQRS forum that takes a different approach, so figured I'd post it here for others who are looking too.

    Here's a quote from Greg Young on a similar question about tracking external state:

    In most inventory systems there are no commands.

    Or to paraphrase:

    Systems that exclusively track external state will have no commands.

    Let's rewind and think through how your system might evolve based on this idea (let's also assume you're not building it for yourself):

    • You decide to create a personal financial tracker that records transactions from the outside world, displays graphs, aggregated totals, etc.
    • Because events are for tracking state changes, not commands, you record those. You also write projections in the event handlers for aggregating the events into totals and graph data points.
    • Then you get users. They praise the app, but usage is still low. After digging deeper, you discover that they still use other apps to track finances when, say, there's no API for the local card store for recurring Mother's Day cards, they want to "split" an external transaction into multiple, their bank has no online access, they want to track cash, etc.
    • So you add user-entered transactions. You do so by adding commands that track user-entered transactions. Now we're at the same system as your question.

    Note that this variant accepts both commands and events. You wouldn't go back and convert all existing events to commands just because you now allow the user to change things. Instead, you have a system that accepts external transaction events, commands for user-entered transactions and transaction corrections (which create events that modify internal state), and projections to combine these internal and external events for display in the app.

    I'm curious though. In hindsight, did the accepted answer end up being a good approach? Or would recording and handling events from the Florist directly like Greg suggests be better?

提交回复
热议问题