De laatste tijd experimenteer ik met dependency injection.
Nu is het zo dat bij een Windows Forms applicatie de composition root in principe zo dicht mogelijk bij de entry point van de applicatie moet staan. Met andere woorden: in de main.
Als ik dan een MainForm heb, dan kan ik deze met zijn dependencies resolven. Dus stel ik heb een MainForm, die afhankelijk is van een MainService, die weer afhankelijk is van een MainRepository, die weer een ISessionFactory gebruikt, enzovoorts dat wordt dit in 1 keer voor mij geregeld.
Hartstikke leuk natuurlijk, maar de gemiddelde Windows Forms applicatie bestaat niet uit 1 form. Zo zou MainForm, een CustomerForm, OrderForm, InvoicesForm, enzovoorts kunnen starten. Als het een beetje gek loopt, heeft MainForm een menu van waaruit je 80 verschillende forms kan laden. En veel van die forms kunnen ook weer andere forms laden.
Wil je dependency injection "netjes" implementeren, dan moet je dus eigenlijk al die forms als dependency aan MainForm meegeven. Kortom, het wordt al snel een zooitje.
Hoe zouden jullie dit aanpakken?
Service Locator is 1 manier, maar wordt over het algemeen als anti-pattern beschouwd. Aan de ene kant krijg je er een hoop gemak bij, aan de andere kant wordt het onduidelijker welke dependencies een class heeft en kan dit unit testen moeilijker maken (Static Gateway pattern kan dit weer deels verhelpen, maar voelt ook niet "goed").
De IoC container doorgeven als dependency zodat classes zelf weer andere kunnen resolven, is ook niet netjes.
Oftewel; ik kan van alles bedenken om het werkbaar te maken, maar heb elke keer het idee dat ik er dan eigenlijk een zooitje van maak (Service Locator, Static Gateway, IoC container injecten).
Help
Nu is het zo dat bij een Windows Forms applicatie de composition root in principe zo dicht mogelijk bij de entry point van de applicatie moet staan. Met andere woorden: in de main.
Als ik dan een MainForm heb, dan kan ik deze met zijn dependencies resolven. Dus stel ik heb een MainForm, die afhankelijk is van een MainService, die weer afhankelijk is van een MainRepository, die weer een ISessionFactory gebruikt, enzovoorts dat wordt dit in 1 keer voor mij geregeld.
Hartstikke leuk natuurlijk, maar de gemiddelde Windows Forms applicatie bestaat niet uit 1 form. Zo zou MainForm, een CustomerForm, OrderForm, InvoicesForm, enzovoorts kunnen starten. Als het een beetje gek loopt, heeft MainForm een menu van waaruit je 80 verschillende forms kan laden. En veel van die forms kunnen ook weer andere forms laden.
Wil je dependency injection "netjes" implementeren, dan moet je dus eigenlijk al die forms als dependency aan MainForm meegeven. Kortom, het wordt al snel een zooitje.
Hoe zouden jullie dit aanpakken?
Service Locator is 1 manier, maar wordt over het algemeen als anti-pattern beschouwd. Aan de ene kant krijg je er een hoop gemak bij, aan de andere kant wordt het onduidelijker welke dependencies een class heeft en kan dit unit testen moeilijker maken (Static Gateway pattern kan dit weer deels verhelpen, maar voelt ook niet "goed").
De IoC container doorgeven als dependency zodat classes zelf weer andere kunnen resolven, is ook niet netjes.
Oftewel; ik kan van alles bedenken om het werkbaar te maken, maar heb elke keer het idee dat ik er dan eigenlijk een zooitje van maak (Service Locator, Static Gateway, IoC container injecten).
Help
Ask yourself if you are happy and then you cease to be.