Ik zit nu in een project waar de teamleden Spring.NET hebben ontdekt en hiermee lekker aan de slag zijn gegaan.
Er wordt driftig gebruik gemaakt van de config file en van Containers en Componenten. De Componenten zijn hierbij Container-aware en de Container heeft een lijst van de Componenten. Het toevoegen van een Component aan de Container gaat middels container.Add(component) en het zetten van de Container gaat middels een property op de Component: de Container property.
Tot zover is alles identiek.
Nu blijkt dat een ieder zijn eigen manier heeft om om te gaan met Containers en Componenten als het gaat om het verbinden van deze 2. Let op dat de Componenten prototypes zijn, en dus niet automatisch door Spring.NET worden geladen:
1.
a. De Container wordt gedefinieerd in de config file
b. De Componenten ook, waarbij middels DI de Container property wordt gezet
c. De Container heeft een init method die vanuit Spring wordt aangeroepen en die de Componenten laadt.
d. De Container roept per Component zelf zijn this.Add(component) method aan
2.
Als 1, maar vanaf d. gaat het anders:
d. De Component roept zelf vanuit zijn Container set property de method container.Add(this) aan om zichzelf aan de lijst toe te voegen.
3.
a. De Container wordt gedefinieerd in de config file
b. De Componenten ook, echter zonder DI van de Container
c. De Container heeft een init method die vanuit Spring wordt aangeroepen en die de Componenten laadt.
d. De Container roept per Component zelf zijn this.Add(component) method aan
e. De Container zet per Component de Container property naar zichzelf
4.
Als 3, maar het binden vindt BUITEN de Container plaats, nl in een init method van het hoofdprogramma.
5.
Een andere aanpak:
a. Deze persoon heeft al zijn objecten die "automatisch" aangemaakt moeten worden in een aparte sub-context ("AutoLoad" genaamd) gezet
b. Een aparte method laad ALLE objecten binnen deze context, dwz doet een GetObject() van alle objecten.
c. Er wordt gebruik gemaakt van DI om de Container property te zetten en van het feit dat als deze wordt gezet, het Component zelf de container.Add(this) method aanroept
Problemen:
a. Het probleem bij 1 en 2 is dat de binding niet gegarandeerd is, immers de Container die het Component laadt, hoeft niet dezelfde te zijn als waarvan in de config file de Container middels DI is gedefinieerd, oftewel de Container kan een Component in zijn lijst hebben staan, maar de Component wijst naar een andere Container...
b. Bij 3 en 4 treedt dit probleem niet op, maar is het binden weer volledig handwerk en wordt het nut van Spring / DI weer minder
c. Bij 5 is alles geautomatiseerd EN klopt altijd de wederzijdse verbinding tussen Container en Component.
Ik streef naar 1 werkmethode, en vind methode 5 wel elegant, maar vraag me af of dit nu ook de beste is, oftewel hoe doen anderen dit??
PS. Er is dus geen gebruik gemaakt van het feit om bij de Container ook de Componentenlijst te definieren. Dit blijkt teveel werk te zijn en te foutgevoelig, zeker als het om honderden objecten gaat!
Er wordt driftig gebruik gemaakt van de config file en van Containers en Componenten. De Componenten zijn hierbij Container-aware en de Container heeft een lijst van de Componenten. Het toevoegen van een Component aan de Container gaat middels container.Add(component) en het zetten van de Container gaat middels een property op de Component: de Container property.
Tot zover is alles identiek.
Nu blijkt dat een ieder zijn eigen manier heeft om om te gaan met Containers en Componenten als het gaat om het verbinden van deze 2. Let op dat de Componenten prototypes zijn, en dus niet automatisch door Spring.NET worden geladen:
1.
a. De Container wordt gedefinieerd in de config file
b. De Componenten ook, waarbij middels DI de Container property wordt gezet
c. De Container heeft een init method die vanuit Spring wordt aangeroepen en die de Componenten laadt.
d. De Container roept per Component zelf zijn this.Add(component) method aan
2.
Als 1, maar vanaf d. gaat het anders:
d. De Component roept zelf vanuit zijn Container set property de method container.Add(this) aan om zichzelf aan de lijst toe te voegen.
3.
a. De Container wordt gedefinieerd in de config file
b. De Componenten ook, echter zonder DI van de Container
c. De Container heeft een init method die vanuit Spring wordt aangeroepen en die de Componenten laadt.
d. De Container roept per Component zelf zijn this.Add(component) method aan
e. De Container zet per Component de Container property naar zichzelf
4.
Als 3, maar het binden vindt BUITEN de Container plaats, nl in een init method van het hoofdprogramma.
5.
Een andere aanpak:
a. Deze persoon heeft al zijn objecten die "automatisch" aangemaakt moeten worden in een aparte sub-context ("AutoLoad" genaamd) gezet
b. Een aparte method laad ALLE objecten binnen deze context, dwz doet een GetObject() van alle objecten.
c. Er wordt gebruik gemaakt van DI om de Container property te zetten en van het feit dat als deze wordt gezet, het Component zelf de container.Add(this) method aanroept
Problemen:
a. Het probleem bij 1 en 2 is dat de binding niet gegarandeerd is, immers de Container die het Component laadt, hoeft niet dezelfde te zijn als waarvan in de config file de Container middels DI is gedefinieerd, oftewel de Container kan een Component in zijn lijst hebben staan, maar de Component wijst naar een andere Container...
b. Bij 3 en 4 treedt dit probleem niet op, maar is het binden weer volledig handwerk en wordt het nut van Spring / DI weer minder
c. Bij 5 is alles geautomatiseerd EN klopt altijd de wederzijdse verbinding tussen Container en Component.
Ik streef naar 1 werkmethode, en vind methode 5 wel elegant, maar vraag me af of dit nu ook de beste is, oftewel hoe doen anderen dit??
PS. Er is dus geen gebruik gemaakt van het feit om bij de Container ook de Componentenlijst te definieren. Dit blijkt teveel werk te zijn en te foutgevoelig, zeker als het om honderden objecten gaat!
[ Voor 3% gewijzigd door Mars Warrior op 16-07-2006 23:32 ]
Material 3 Thema's voor HA | Swiss Army Knife custom card voor HA | AmoebeLabs