I’ve been searching for weeks for an answer to this question, which seems as though it would be common across pretty much all applications and therefore a problem right at the forefront of CQS.
CQS dictates that a function should either:
- Change state and return void (command), or
- Change nothing and return a result (query)
So, let’s say we want to create a new data entity, persist it in the database, then issue a notification of the auto-incremented ID.
First, we create the object – at this point it has no unique identifier. We then save it to the database, which generates a unique identifier via the auto-incremented ID field. The query execution result is returned to the application, returning the resultant database row, which can then be interrogated to determine the ID. (q.v. PostgreSQL INSERT…RETURNING)
Given that we’re issuing the insert as a command (it is changing the ID on our object from null
to “something”), and commands must return void, how do we determine the generated ID?