Here are some documents associated with CQRS, they originated as class manual.
- A Stereotypical Architecture – covers what would be a stereotypical architecture and covers some of the problems that tend to exist within it.
- Task Based User Interface – introduces the concept of a Task Based UI
- CQRS – introduces the concept of CQRS
- Events as a Storage Mechanism – using events as a storage mechanism from a conceptual level
- Building an Event Storage – issues of actually building an event storage
- CQRS and Event Sourcing – synergies that exist between CQRS and Event Sourcing
There will be more documents appearing here shortly.
Could you post PDF versions of theses documents ? Not everybody can comfortably read DOCX files.
Thanks in advance.
Could you remove the annoying “snapshots” thing, makes it really annoying.
You can do it yourself (there is a link to say never show)
The blog of Pål Fossmo [C# MVP] was pretty useful in terms of .Net CQRS:
Just wanted to say thanks for all of this info. A co-worker introduced me to this concept and, as I am a bit of a junior developer, the whole thing went over my head. These documents have made everything so much clearer. Thank you.
Regarding the docx files: if you are on windows, you can download a viewer here:
Thanks for great work and time you have invested on getting all these info explained and available for everyone. I am new to this concept and going through document and video. I am getting really confused with term “aggregate”. For me aggregate is sum groups in SQL :P. I am tying to understand what aggregate represent to in CQRS. Can you plz have this term explained bit more detail?
Thanks in advance.
Aggregate is a term from Domain Driven Design. Basically it represents a consistency boundary around a group of objects.
Thanks for last reply, that helped a lot. I was looking all week trying to understand concept and looked some implementations and got one sample created with nCQRS.
I have created a Order domain/aggregate root. Order has Line Items and Payments. Pretty simple order example with line item added, payment added events.
Now when I get AddLineItemCommand, I need to check if this product has enough inventory. Here I got 2 questions that I am not able to get clear answer to
First, where I should have this inventory check- with in Order domain object?
Second, Where it should look for inventory value – Product domain or read model?
I was thinking to have a ProductSold command executed on product domain from Order domain. If this command success, I add line item to order otherwise not. Now question is, is domain execute command on other domain is allowed/good practice?
Let me know if things doesn’t make sense.
Thanks in advance.
Thanks for these docs, I thought they provide a quick read but still got across the salient points, well done.
re: Aggregate – not be confused with a boundary though. A simple example, might be a Person Aggregate that contains/associated with a Contact Object and an Address Object. External clients can only deal with Person not Contact or Address. So it’s aggregating the other objects into a single client facing component – at least that how I like to think of it!
The term is used as Aggregtae in DDD not as in aggregate in UML.
Can you please provide your openion a very typical scenario that arises in all e-commerce application. I have a ShoppingCart AggregateRoot along with ShoppingCartLineItem as entity managed by ShoppingCart. Once the user proceeds to checkout, an Order AggregateRoot object should be created which will manage OrderLineItem objects per ShoppingCartLineItem. Since in Cqrs world, we keep the object state private and only expose behavioral methods which operate on the object state and we don’t keep public properties to expose an aggregate/entity object state, we will have to ask ShoppingCart aggreate root for the state or data that’s required to create Order aggregate and Orderlineitems which ShoppingCart will be return as valueobject(s) which can have public readonly properties so Order aggregate object could be passed this state/data from a command handler.
Is this the way this very normal scenario should be handled or is there some better way of doing it as well? Please provide your feedback over it.