Una delle domande principale che mi faccio talvolta parlando di IoC e di AOP è se utilizzare castle o spring...Spring è una libreria in giro da più tempo e più matura, la documentazione inoltre è migliore di quella di Castle effettivamente, ma se dovessi scegliere sceglierei Castle, per una serie di motivi.
Il primo motivo è le API pubbliche che si utilizzano, Castle.Windsor è fortemente tipizzato, ad esempio per recuperare un istanza si usa questo codice
MyInterface instance = _container.Resolve<MyInterface>();
dove naturalmente _container è un istanza di WindsorContainer che possiamo ottenere da un file xml di configurazione o da una sezione nell'app.config. Il parallelo di un WindsorContainer in Spring è un IApplicationContext (analoga configurazione)
MyInterface instance = (MyInterface) ac["MyInterfaceName"];
La differenza sostanziale che noi possiamo chiedere a Windsor "dammi l'istanza di default che implementa l'interfaccia MyInterface", mentre in spring si deve sempre fornire il nome dell'oggetto inserito nella configurazione ed è necessario inserire un cast. La differenza è minima, ma Windsor mi piace maggiormente perchè è più da "design by contract". Stabilito infatti che l'interfaccia è un contratto, posso chiedergli l'oggetto concreto per quel contratto.
Alk.
P.S. Naturalmente anche in spring posso fare una cosa del genere, ma debbo scrivere più codice
IDictionary returnvalue = ActualContainer.GetObjectsOfType(typeof(T));
foreach (T instance in returnvalue.Values) {
return instance;
}
throw new ApplicationException("nessun oggetto configurato che implementa " + typeof(T).Name);
In generale in spring posso prendere tutti gli oggetti che implementano un dato tipo, questo torna un dictionary di coppie nome valore dove nome è l'id del componente configurato e il valore è un istanza dell'oggetto. Oltre ad essere poco leggibile come codice, ogni volta che desidero un componente di default lui istanzia comunque tutti gli oggetti che implementano T e gli altri vengono semplicemente scartati.