Back on Repositories and Paging. Introducing reporting.
I had quite a lot of comments on my previous post on repositories and paging, and there’s a lot of people coming from google looking for answers… It’s sign that there’s no good response to this issue now.
The problem was how paging (a presentation concern) fits into a repository that should have only domain concerns…
And the short answers is… It doesn’t fit !
It doesn’t mean you should forget everything I told you before but there’s a vision change.
There’s something missing in DDD book…
but present in current discussion about DDD. The book provides good building blocks (entities, repository…) but Evans says himself it has been a bit over emphasized. The book is mainly about maintaining and mutating your domain state, not about it’s presentation.
CQS to the rescue
The CQS (Command Query Separation) principle proposes to decouple Commands that change the state of the system, from Queries that ask the state of the system.
The repository lies on the Command side, that’s why :
- It should be specialized to express only mutations that are possible for the system
- It should not expose presentation concerns like paging
But what’s on the Query side ?
The query side should be far more supple and provide tools to query the state of the domain. It can even be implemented with IQueryable interfaces to provide that flexibility. Asking for pages in this area is natural since you just want to query a part of the domain state.
The goal of all this is to report the state of the system. So Reporting is a good name here.
You can read Greg Young’s DDDD posts to see where CQS can lead : Write only domain model (Commands) and rich scalable distributed Query mechanisms using messaging.
There’s no clear guidance yet in this field but I’m still investigating. The flexibility of a reporting service in the domain layer is still a huge gain to understand where each concept fits.