Sinds een tijd ben ik bezig met Domain Driven Design. Nu loop ik echter tegen een probleem aan. Beschouw het volgende kleine voorbeeld. Er is een spel met gebruikers en die gebruikers winnen elke keer dat een ronde afgelopen is een prijs; goud, zilver of brons.
In dit voorbeeld is User een entity aangezien hij identiteit heeft. Zo'n Award echter is volgens mij een Value Object omdat ik niet geinteresseerd ben in de identiteit van de Award. Voor zover ik begrepen heb vormen deze twee klassen de Aggregate root, waarbij met behulp van een UserRepository een User opgehaald kan worden. De relatie tussen User en Award is one-to-many, omdat een User meerdere Awards kan hebben.
Het tonen van de Awards zal weinig voorkomen. Mijn grote vraag is nu; hoe kan je het beste Lazy Load implementeren op Value Objects? Er is namelijk geen DatabaseAwardRepository met een getAwardsByUser(User $user) methode omdat je slechts een Repository hebt voor je Aggregate root. Zo'n getAwardsByUser methode moet je ook niet implementeren op de DatabaseUserRepository. Wat als er een loadAwards(User $user) methode op de DatabaseUserRepository gezet wordt die een opgegeven User object vult met een lijst van Awards.
Kortom: is hier wel sprake van een Value Object? Of zijn het twee aggregates zodat twee Repositories wel noodzakelijk zijn? Kortom: hoe kijken de ervaren DDD-ers hier tegen aan? Hoe zouden jullie dit implementeren?
In dit voorbeeld is User een entity aangezien hij identiteit heeft. Zo'n Award echter is volgens mij een Value Object omdat ik niet geinteresseerd ben in de identiteit van de Award. Voor zover ik begrepen heb vormen deze twee klassen de Aggregate root, waarbij met behulp van een UserRepository een User opgehaald kan worden. De relatie tussen User en Award is one-to-many, omdat een User meerdere Awards kan hebben.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
| class DatabaseUserRepository implements UserRepository { public function getUserById($userId) { $resultset = $this->database->query("SELECT ..."); if ($resultset->length () > 0) { return UserFactory::create($resultset->next()); } else { throw new UserDoesNotExistException(); } } } |
PHP:
1
2
3
4
5
6
| class User { public function getAwards() { ? } } |
Het tonen van de Awards zal weinig voorkomen. Mijn grote vraag is nu; hoe kan je het beste Lazy Load implementeren op Value Objects? Er is namelijk geen DatabaseAwardRepository met een getAwardsByUser(User $user) methode omdat je slechts een Repository hebt voor je Aggregate root. Zo'n getAwardsByUser methode moet je ook niet implementeren op de DatabaseUserRepository. Wat als er een loadAwards(User $user) methode op de DatabaseUserRepository gezet wordt die een opgegeven User object vult met een lijst van Awards.
Kortom: is hier wel sprake van een Value Object? Of zijn het twee aggregates zodat twee Repositories wel noodzakelijk zijn? Kortom: hoe kijken de ervaren DDD-ers hier tegen aan? Hoe zouden jullie dit implementeren?