Разве вы не можете установить идентификаторы своих объектов во время создания и сделать их доступными только для чтения, вместо того, чтобы устанавливать идентификаторы с помощью метода установки?
Или вам нужно установить идентификатор в другое время. Если это так, не могли бы вы объяснить, почему?
EDIT:
Можно ли развести ID и объект домена? Нужно ли знать что-либо, кроме хранилища, идентификатор?
Удалите поле ID из вашего доменного объекта, и ваши реализации репозитория отслеживают идентификаторы объектов с помощью частного словаря. Таким образом, любой может создавать экземпляры ваших доменных объектов, но они не могут делать глупые вещи с идентификаторами.
Таким образом, идентификаторы объектов домена являются теми, какими решит реализация репозитория - они могут быть целыми числами из базы данных, URL-адресов или имен файлов.
Если кто-то создает новый объект домена за пределами хранилища и, скажем, пытается сохранить его в своем хранилище, вы можете найти идентификатор объекта и сохранить его соответствующим образом. Если идентификатор отсутствует, вы можете либо сгенерировать исключение, чтобы сказать, что вам нужно создать объект с помощью метода репозитория, либо создать новый идентификатор для него.
Есть что-нибудь, что помешало бы вам использовать этот шаблон?