"The shell stopped unexpectedly and Explorer.exe was restarted."
Het boek 'domain driven design' lezen.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?
Nee, je maakt in dit geval één repository: nl. een voor klanten.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?
Je kan zowiezo geen factuur hebben die niet aan een klant gekoppeld is.
https://fgheysels.github.io/
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:
1
2
| Project p = ProjectRepository.FindByID( 5 ); facturenDisplayControl.Facturen = p.Facturen; // Dit kan bijvoorbeeld een CouldNotConnect exception oid opleveren. |
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 ]
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.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
https://fgheysels.github.io/
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 bedrijfwhoami 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.
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 ]
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."
Als het goed is komt dat niet voor, want je Facturen en Klanten bevinden zich toch altijd binnen een Project?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?
Of zie ik dit verkeerd?
"The shell stopped unexpectedly and Explorer.exe was restarted."
Waarom zou je 5000 klanten 'objecten' ophalen ?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)
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/
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 zondenwhoami 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.
* pjvandesande tikt zachtjes tegen whoami
Ik wou nog weten om welk boek het ging
[ Voor 3% gewijzigd door pjvandesande op 28-10-2005 10:16 ]
[rml]whoami in "[ Alg] Centraal boekentopic - part II"[/rml]questa schreef op vrijdag 28 oktober 2005 @ 10:14:
[...]
* whoami tikt zachtjes tegen whoami
offtopic:
Ik wou nog weten om welk boek het ging
https://fgheysels.github.io/
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."
Enkel voor 'aggregate roots' zou je een repository moeten maken, en zo'n repository kan dus enkel dingen afhandelen voor die ene 'aggregate - root'.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)?
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/
Facturen := KlantRepository.GetAllFacturen();
"The shell stopped unexpectedly and Explorer.exe was restarted."
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/
Ik kan me voorstellen dan je een overzicht wil genereren van alle facturen, of alle openstaande facturen etc.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 ?
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.
"The shell stopped unexpectedly and Explorer.exe was restarted."
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.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).
De Add method van de FactuurRepository accepteer niet alleen een Factuur object maar ook een Klant object waar je de factuur aan wilt toevoegen.
Waarom zou je dat doen ? Een factuur is van een klant. Een klant heeft facturen.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.
Dan heb je geen 'self-revealing interfaces' meer.De Add method van de FactuurRepository accepteer niet alleen een Factuur object maar ook een Klant object waar je de factuur aan wilt toevoegen.
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/
Ben ik het mee eens.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.
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.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.
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.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 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/