Ik zit me af te vragen in welke gevallen je opteert voor 'dependency injection', en in welke gevallen je dan weer kiest voor een 'service locator'.
Zijn hier bepaalde 'guidelines' voor, is het puur kwestie van smaak, wat zijn de voordelen / nadelen van de ene aanpak tov de andere ?
Stel, je hebt een class 'Customer'.
Die class Customer heeft een property 'Status'. Die property geeft weer of de klant een 'Gold Customer' , een 'Normal Customer', of een 'Bad Payer' is.
Om dit na te gaan, heb je een aantal gegevens nodig uit de database; bv, om na te gaan of de klant een 'Gold Customer' is, moet je checken of de klant in de laatste 3 maanden minstens voor 2000 euro spullen besteld heeft; als hij daarentegen meer dan 3 facturen op 5 te laat betaald heeft, dan is het een bad payer.
Om dit na te gaan , heb je dus in de Customer class een 'InvoiceRepository' nodig.
De vraag is nu; hoe ga je die InvoiceRepository aan die customer class gaan aanleveren ?
Ga je dit doen mbhv 'Dependency Injection' (bv een instance van een InvoiceRepository aanleveren aan het Customer object mbhv de constructor of een setter), bv:
of, ga je mbhv een 'Service Locator' binnen die Status property de correcte / gewenste IInvoiceRepository gaan ophalen ?
Dus, in welke gevallen kies je voor 'injection', en wanneer kies je voor 'locators' ?
Zijn hier bepaalde 'guidelines' voor, is het puur kwestie van smaak, wat zijn de voordelen / nadelen van de ene aanpak tov de andere ?
Stel, je hebt een class 'Customer'.
Die class Customer heeft een property 'Status'. Die property geeft weer of de klant een 'Gold Customer' , een 'Normal Customer', of een 'Bad Payer' is.
Om dit na te gaan, heb je een aantal gegevens nodig uit de database; bv, om na te gaan of de klant een 'Gold Customer' is, moet je checken of de klant in de laatste 3 maanden minstens voor 2000 euro spullen besteld heeft; als hij daarentegen meer dan 3 facturen op 5 te laat betaald heeft, dan is het een bad payer.
Om dit na te gaan , heb je dus in de Customer class een 'InvoiceRepository' nodig.
De vraag is nu; hoe ga je die InvoiceRepository aan die customer class gaan aanleveren ?
Ga je dit doen mbhv 'Dependency Injection' (bv een instance van een InvoiceRepository aanleveren aan het Customer object mbhv de constructor of een setter), bv:
code:
1
2
| Customer c = customerRepository.GetCustomer (5); c.InvoiceRepository = repositoryFactory.GetInvoiceRepository(); |
of, ga je mbhv een 'Service Locator' binnen die Status property de correcte / gewenste IInvoiceRepository gaan ophalen ?
code:
1
2
3
4
5
6
7
8
9
10
| public CustomerStatus Status
{
get
{
IInvoiceRepository invRep = DomainSettings.Instance.RepositoryLocator.GetInvoiceRepository();
...
}
} |
Dus, in welke gevallen kies je voor 'injection', en wanneer kies je voor 'locators' ?
https://fgheysels.github.io/