Ik heb alleen ervaring met IoC frameworks op het .NET framework, maar puur IoC is niet handig als je support wilt hebben voor meerdere soorten IoC/DI frameworks en dan gaat het vooral om de zogenaamde annotated DI frameworks zoals Unity, ObjectBuilder of Ninject. Deze hebben elk hun eigen attributen (InjectionConstructor vs Inject attribute). Nu kun je natuurlijk de attributen van beide frameworks toepassen, maar dan is je code weer strongly tied aan bepaalde IoC frameworks en bij een installatie moet je dan ook al die frameworks meeleveren.
Unity en Ninject hebben dan weer wel als voordeel dan de configuratie een stuk minder gevoelig is, omdat hun configuratie in de code gebeurt en je dus code completion en een compiler error krijgt als je een type verkeerd schrijft. Andere frameworks (Windsor containers, Spring, AutoFac, StructureMap, etc) gebruiken een XML configuratie bestand. Windsor 2.0 heeft inmiddels van Ayende Rahien ook als een fluent configuration syntax (Component.For<>().ImplementedBy<>() ) gekregen.
Hoewel Microsoft al zelf met een CSL (Common Service Locator) is gekomen mist deze nog wel een aantal features zoals de mogelijkheid om een bestaande instantie door de CSL te halen (denk bijvoorbeeld aan een HttpApplication instance in je global.asax.cs).
De CSL kan als Singleton gebruikt worden (ServiceLocator.Current) of kan worden geinjecteerd. Wij hebben dus een eigen CSL implementatie en die gebruik ik op beide manieren. De Singleton methode is dus handig in je global.asax waar je geen controle hebt over hoe deze wordt aangemaakt.
C#:
1
2
3
4
5
6
7
8
| public class Global : HttpApplication
{
public Global()
{
IocFactory ioc = IocFactory.Current;
ioc.Load(this); //dependencies worden alsnog geladen voor de HttpApplication
}
} |
Maar op andere plaatsen gebruik je de CSL om een nieuwe instantie aan te maken en de DI injecteerd op dat moment als de gewenste dependencies.
Als Singletons goed worden gebruikt maakt deze unit testing ook niet lastiger. Echter ben ik het wel eens met de algemene regel dat je singletons moet vermijden waar mogelijk. Echter koste wat kost geen singleton (durven te) gebruiken is ook weer niet goed.
If it isn't broken, fix it until it is..