[DDD] Indeling repositories*

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik ben bezig met een systeem waarbij ik mijn business objecten vul vanuit repositories. Nu probeer ik hier een beetje structuur in te krijgen door de repositories op te splitsen, maar aangezien ik hier niet zoveel ervaring mee heb vraag ik me af hoe ik dit het beste kan doen?

Stel ik heb de volgende objecten:
Project bevat Factuur bevat Klant
Is het verstandig (om afhankelijkheden te voorkomen) voor elk object een repository te maken? Hoe laadt ik dan dit geheel in 1x in zodat ik van Project naar Factuur naar Klant kan?

Ik ben benieuwd hoe andere ontwikkelaars hun repositories opzetten?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
Kaassoevlee schreef op vrijdag 28 oktober 2005 @ 09:38:
maar aangezien ik hier niet zoveel ervaring mee heb vraag ik me af hoe ik dit het beste kan doen?
Het boek 'domain driven design' lezen.
Stel ik heb de volgende objecten:
Project bevat Factuur bevat Klant
Is het verstandig (om afhankelijkheden te voorkomen) voor elk object een repository te maken? Hoe laadt ik dan dit geheel in 1x in zodat ik van Project naar Factuur naar Klant kan?

Ik ben benieuwd hoe andere ontwikkelaars hun repositories opzetten?
Nee, je maakt in dit geval één repository: nl. een voor klanten.
Je kan zowiezo geen factuur hebben die niet aan een klant gekoppeld is.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

Je kunt de repository's gebruik laten maken van Gateway's, als ProjectRepository.LoadByID( 5 ) word aangeroepen zal binnen deze method dmv Gateway's het Project worden opgezocht en de bij behorende Facturen.

Alleen wil je wel alles in 1 keer inladen? Je kun ook denken aan iets van Lazy-Loading, dus het Project inladen en zodra project.Facturen word opgevraagt en ze zijn nog niet ingeladen worden ze alsnog ingeladen.

Het nadeel hiervan is dat dus dit een Exception kan hebben:

code:
1
2
Project p = ProjectRepository.FindByID( 5 );
facturenDisplayControl.Facturen = p.Facturen; // Dit kan bijvoorbeeld een CouldNotConnect exception oid opleveren.
whoami schreef op vrijdag 28 oktober 2005 @ 09:55:
[...]

Het boek 'domain driven design' lezen.
Het boek met de mooiste voorkant?
Domain-Driven Design: Tackling Complexity in the Heart of Software (Hardcover)

[ Voor 26% gewijzigd door pjvandesande op 28-10-2005 10:00 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
questa schreef op vrijdag 28 oktober 2005 @ 09:57:
Alleen wil je wel alles in 1 keer inladen? Je kun ook denken aan iets van Lazy-Loading
Aan lazy loading hoef je pas te denken als het echt nodig is, bv, als je het 'risico' loopt om een ganse tree data uit de DB te trekken die je toch niet gaat nodig hebben, of als je echt last hebt van een tekort aan performance. Anders brengt het alleen maar complexiteit met zich mee, imho.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

whoami schreef op vrijdag 28 oktober 2005 @ 09:59:
[...]

Aan lazy loading hoef je pas te denken als het echt nodig is, bv, als je het 'risico' loopt om een ganse tree data uit de DB te trekken die je toch niet gaat nodig hebben, of als je echt last hebt van een tekort aan performance. Anders brengt het alleen maar complexiteit met zich mee, imho.
Stel dat je alle klanten ophaalt wat er 5000 zijn en daarbij dus ook gelijk alle facturen, zo'n 1000 per klant. (dan doe je het goed als bedrijf ;))

Dat kan een enorme data tree veroorzaken. Maar ik ben het helemaal met je eens! Zolang het niet teveel overhead is. Als je systeem niet tekort aan performance heeft dan zou ik er zeker niet aan beginnen.

[ Voor 4% gewijzigd door pjvandesande op 28-10-2005 10:03 ]


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Lazy loading ken ik, pas dat alleen toe als het nodig is. En het lost naar mijn idee niet mijn eerste "probleem" op.

Ik schrijf dus 1 repository (ProjectRepository) welke een complete tree van Project + Factuur + Klant gegevens in laadt. Maar wat als ik ergens alleen een Factuur + Klant nodig heb (dus niks met Project te maken heb)? Gebruik ik kan ook de ProjectRepository om een Factuur in te laden?

[ Voor 5% gewijzigd door jelmervos op 28-10-2005 10:05 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

Kaassoevlee schreef op vrijdag 28 oktober 2005 @ 10:04:
Maar wat als ik ergens alleen een Factuur + Klant nodig heb (dus niks met Project te maken heb)? Gebruik ik kan ook de ProjectRepository om een Factuur in te laden?
Als het goed is komt dat niet voor, want je Facturen en Klanten bevinden zich toch altijd binnen een Project?

Of zie ik dit verkeerd?

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Stel dat de gebruiker de klant gegevens van klant #32 wil bewerken. Dan doe ik toch niet in het klanten-bewerk-scherm: ProjectRepository.GetClientById(32)?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
questa schreef op vrijdag 28 oktober 2005 @ 10:02:
[...]


Stel dat je alle klanten ophaalt wat er 5000 zijn en daarbij dus ook gelijk alle facturen, zo'n 1000 per klant. (dan doe je het goed als bedrijf ;))
Waarom zou je 5000 klanten 'objecten' ophalen ?
Als je een overzicht wilt van klanten, dan kan je ook een ander class type gebruiken, bv, een readonly 'KlantListInfo' oid die enkel wat nuttige informatie bevat om een klant weer te geven in een lijst.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

whoami schreef op vrijdag 28 oktober 2005 @ 10:09:
[...]

Waarom zou je 5000 klanten 'objecten' ophalen ?
Als je een overzicht wilt van klanten, dan kan je ook een ander class type gebruiken, bv, een readonly 'KlantListInfo' oid die enkel wat nuttige informatie bevat om een klant weer te geven in een lijst.
Inderdaad, dan los je dat op door alleen nuttige informatie op te halen. Maar ik heb het vaker gezien bij mensen die beginnen met Repository's etc, als ze een ListView wilden vullen met klanten gebruikte ze KlantRepository.FindAll waarbij dus alle klanten plus orders en betaal gegevens werden opgehaalt. Beetje zonden :)

* pjvandesande tikt zachtjes tegen whoami
offtopic:
Ik wou nog weten om welk boek het ging

[ Voor 3% gewijzigd door pjvandesande op 28-10-2005 10:16 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
questa schreef op vrijdag 28 oktober 2005 @ 10:14:
[...]


* whoami tikt zachtjes tegen whoami
offtopic:
Ik wou nog weten om welk boek het ging
[rml]whoami in "[ Alg] Centraal boekentopic - part II"[/rml]

https://fgheysels.github.io/


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik snap het principe van lazy loading en wanneer dit toe te passen is, maar het lost niet mijn probleem op.
Hoe zorg ik voor een duidelijke splitsing tussen repositories? Hebben deze onderling kennis van elkaar? Kunnen twee repositories het zelfde inladen (ProjectRepository laadt klant, KlantRepository laadt klanten)?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
Kaassoevlee schreef op vrijdag 28 oktober 2005 @ 10:41:
Ik snap het principe van lazy loading en wanneer dit toe te passen is, maar het lost niet mijn probleem op.
Hoe zorg ik voor een duidelijke splitsing tussen repositories? Hebben deze onderling kennis van elkaar? Kunnen twee repositories het zelfde inladen (ProjectRepository laadt klant, KlantRepository laadt klanten)?
Enkel voor 'aggregate roots' zou je een repository moeten maken, en zo'n repository kan dus enkel dingen afhandelen voor die ene 'aggregate - root'.
In jouw geval heb je dus een klant-repository die verantwoordelijk is voor het ophalven van klanten incl hun facturen, want een factuur behoort tot een klant.

https://fgheysels.github.io/


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Oke, en als ik ergens in het systeem een lijst van alle facturen wil tonen? Doe ik dan:
Facturen := KlantRepository.GetAllFacturen();

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
Een lijst van alle facturen tonen ?
Wil je dat wel ?

Wat ben je met een lijst van facturen, als je niet weet voor welke klant ze waren/zijn ?

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

whoami schreef op vrijdag 28 oktober 2005 @ 12:23:
Een lijst van alle facturen tonen ?
Wil je dat wel ?

Wat ben je met een lijst van facturen, als je niet weet voor welke klant ze waren/zijn ?
Ik kan me voorstellen dan je een overzicht wil genereren van alle facturen, of alle openstaande facturen etc.

Hiervoor zou je wel een FactuurRepository maken, alleen kan dit eigelijk niet. Want je haalt een Factuur op maar dan weet je daar de klant weer niet van.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Inderdaad, je kunt op verschillende manieren "binnenkomen", vanaf factuur (bijvoorbeeld alle factureren van 2005 + klant gegevens) of vanaf klant (alle facturen van een bepaalde klant).

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

Kaassoevlee schreef op zaterdag 29 oktober 2005 @ 11:36:
Inderdaad, je kunt op verschillende manieren "binnenkomen", vanaf factuur (bijvoorbeeld alle factureren van 2005 + klant gegevens) of vanaf klant (alle facturen van een bepaalde klant).
Misschien moet je er aan denken om de directe relatie van Klant->factuur los te laten. Dus je maakt een losse FactuurRepository en haalt de FactuurCollection member (oid) weg uit de Klant class.

De Add method van de FactuurRepository accepteer niet alleen een Factuur object maar ook een Klant object waar je de factuur aan wilt toevoegen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
questa schreef op zondag 30 oktober 2005 @ 10:21:
[...]


Misschien moet je er aan denken om de directe relatie van Klant->factuur los te laten. Dus je maakt een losse FactuurRepository en haalt de FactuurCollection member (oid) weg uit de Klant class.
Waarom zou je dat doen ? Een factuur is van een klant. Een klant heeft facturen.
De Add method van de FactuurRepository accepteer niet alleen een Factuur object maar ook een Klant object waar je de factuur aan wilt toevoegen.
Dan heb je geen 'self-revealing interfaces' meer.

Waar ik het wel mee eens ben, is dat je een FactuurRepository maakt. Maar dan eentje die enkel 'Overzicht Factuur Objecten' (collections) returned, en evt één factuur object kan ophalen. Saven etc... zou hij niet mogen.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

whoami schreef op zondag 30 oktober 2005 @ 10:32:
[...]

Waarom zou je dat doen ? Een factuur is van een klant. Een klant heeft facturen.


[...]

Dan heb je geen 'self-revealing interfaces' meer.
Ben ik het mee eens.
whoami schreef op zondag 30 oktober 2005 @ 10:32:Waar ik het wel mee eens ben, is dat je een FactuurRepository maakt. Maar dan eentje die enkel 'Overzicht Factuur Objecten' (collections) returned, en evt één factuur object kan ophalen. Saven etc... zou hij niet mogen.
En hoe kom je dan weer achter de klant van de factuur, ik kan me voorstellen dat je binnen de lijst waar je de Facturen weergeeft ook de klant wilt zien.

Dit kun je onder brengen in het apparte OverzichtFactuur object, maar laad je dan ook gelijk alle orders in de factuur?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:12
questa schreef op zondag 30 oktober 2005 @ 10:37:
[...]


En hoe kom je dan weer achter de klant van de factuur, ik kan me voorstellen dat je binnen de lijst waar je de Facturen weergeeft ook de klant wilt zien.

Dit kun je onder brengen in het apparte OverzichtFactuur object, maar laad je dan ook gelijk alle orders in de factuur?
Die klant kan je tonen in je 'overzichtfactuur'. Daar hoeven ook de factuur-details niet in te zitten.
Die overzicht objecten zijn er alleen maar om een overzicht te hebben; een overzicht is imho een lijst.
Als je dan één item uit die lijst wil zien (die ene factuur dus), dan laad je gewoon dat factuur object in adhv een method van je factuur repository.

https://fgheysels.github.io/

Pagina: 1