In wikipedia\'s definition of command query separation, it is stated that
More formally, methods should return a value only if they are referentially t
This question is old but has not received a satisfying answer yet, so I'll elaborate a bit on my comment from almost a year ago.
Using an event driven architecture makes a lot of sense, not only for achieving clear command/query separation, but also because it opens new architectural choices and usually fits with an asynchronous programming model (useful if you need to scale your architecture). More often than not, you will find the solution may lie in modelling your domain differently.
So let's take your purchase example. StoreService.ProcessPurchase
would be a suitable command for processing a purchase. This would generate a PurchaseReceipt
. This is a better way instead of returning the receipt in Order.Result
. To keep things very simple, you can return the receipt from the command and violate CQRS here. If you want a cleaner separation, the command would raise a ReceiptGenerated
event that you can subscribe to.
If you think about your domain, this may actually be a better model. When you're checking out at a cashier, you follow this process. Before your receipt is generated, a credit card check might be due. This is likely to take longer. In a synchronous scenario, you would wait at the cashier, unable to do anything else.