You could subscribe to events, then update read models in some database (could be tables in a SQL database, documents in a document database), or in an in-memory object model. that reads from the same storage as your write side.You would then query these read models by loading them from the database or the in-memory model. In this scenario, the concept of a read model might just be a database query. For example, an API or web page request comes in, you execute a query against your database, then return the results to the user. You have still separated your reads from your writes, you just haven't used events.The actual implementation of these would depend on your architecture.For example, if using Event Store the client has built in support for the concept of subscribers.These could be implemented in a simple console app for example, or inside an API. Your entities in the write model have a public interface that contains the write methods, but they also include a restricted interface that copies the current state (a read).Your entities in the read model have a public interface that contains read methods, but also include a restricted interface that replaces the current state (a write).
If you're using events, it will be the subscribers to the events.You would listen to events, then update your read models.