Some concepts in the Domain demand Identity — that is, changes to their internal states don't change their own unique identities. We've seen how modeling Identity as a Value Object brings benefits like immutability, in addition to logic for operating the Identity itself. We've also shown several ways of providing Identity, restated in the following pointers:
- Persistence mechanism: Easy to implement, but you won't have the Identity before persisting the object, which delays and complicates event propagation.
- Surrogate ID: Some ORMs require an extra field on your Entity to map the Identity with the persisting mechanism.
- Provided by the client: Sometimes the Identity fits a Domain concept and you can model it inside your Domain.
- Generated by the application: You can use a library to generate IDs.
- Generated by a Bounded Context: Probably the most complex strategy. Other Bounded Contexts provide an interface for generating Identities.
We've seen and discussed Doctrine as a persistence mechanism...