Вы отметили
Цель состоит в том, чтобы повысить производительность веб-приложения путем кэширования любых объектов, извлекаемых из хранилища.
Так что я думаю, что вам следует реализоватьэто прозрачно в вашем хранилище.Хранилище предназначено для скрытия сведений о постоянстве от домена, и если вы хотите кэшировать большие объекты для повышения производительности, то домен не должен быть мудрым.Ваш репозиторий должен стать немного умнее, потенциально отслеживая несколько копий одного и того же объекта, поскольку параллельные потоки запрашивают объекты и одновременно изменяют их.Или - если возможно - сериализовать доступ к отдельным агрегатным корням, поскольку они представляют границы транзакций.
Как указывал @Oded, кэширование действительно может происходить где угодно, и вы, вероятно, обнаружите, что реализуете его во многих местах.если производительность является проблемой, и каждое место может сделать это по-своему.Например, вы можете кэшировать результаты определенных запросов в вашем домене, или вы можете кэшировать целые HTML-ответы.
Межуровневая координация приходит, потому что кеши могут быть довольно утечкой абстракции.Если ваши доменные объекты кэшируются, когда они должны быть кэшированы?Что если один поток использует кэшированный объект, а другой - нет?Что если вы кэшируете результаты запроса, но базовые объекты с тех пор изменились?Когда делать недействительными и как сделать недействительными являются сложными вопросами, как с точки зрения инфраструктуры, так и с точки зрения бизнеса.Устаревшие запросы не всегда плохи.