I have the following scenario which I need to implement following the CQRS pattern:
- a user logs in
- the user enters some insurance details
- the user ask for a decision to be applied
- the user views the result of the decision
This seems fairly straightforward, however my problem is between step 3 and 4, on step 3 I send a ApplyForDecision
command which will get a decision from a underwriting service, an event with the result of that decision is then sent to the BUS for the read store to later consume it and update the view tables with the decision result.
The problem is on the UI, how do I let the user know that the decision is being applied, since in CQRS the read model is not updated 'straightaway' how do I make the UI show that a decision is in progress and will 'soon' arrive?
I also need to give the user the ability to log out and log back in, since the decision ma开发者_开发问答y not have been applied yet, how do I make the UI show the 'pending decision screen'?
The answer is to immediately raise an event indicating the decision has been applied for, update the read DB and redirect straight away to your pending decision screen whether or not the read DB has been updated by that time. Static text 'Pending decision you will be contacted' or something along those lines. They can refresh or come back later and more than likely will get the real data. Then when the decision has been decided, you have a DecisionMade event and update the read DB, send emails out, whatever the case, accordingly.
That's the trade off with eventual consistency you have to deal with in CQRS. Often when I've made changes to domain object properties on a form, I fake it in the immediate feedback the user gets while the back end does its chores. Yes, a little ugly but the users don't know that.
IMHO the solution would be to let your command emit an "ApplyForDecisionRequested" and an "ApplyForDecisionHandled" event, and update your read model accordingly.
精彩评论