Ho sperimentato l'utilizzo di delegati denominati anziché interfacce a metodo singolo. Questo ha alcuni vantaggi per le dimensioni del codice, come si può andare da (qualche interruzione di linea asportate per non sovrastimare il caso):C'è un modo semplice per registrare chiusure statiche con Castle Windsor?
public interface IProductSource
{
IEnumerable<Product> GetProducts();
}
public class DataContextProductSource : IProductSource
{
private readonly DataContext _DataContext;
public DataContextProductSource(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
_DataContext = dataContext;
}
public IEnumerable<Product> GetProducts()
{
return _DataContext.Products.AsEnumerable();
}
}
a:
public delegate IEnumerable<Product> DGetProducts();
public static class DataContextFunctions
{
public DGetProducts GetProducts(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
return() => dataContext.Products.AsEnumerable();
}
}
questo è fondamentalmente approfittando del fatto che quando si va abbastanza avanti con l'iniezione di dipendenza, molte classi diventano poco più che chiusure. Queste classi possono essere sostituite con funzioni che restituiscono lambda. Intere serie di funzioni correlate (che non hanno bisogno di incapsulare uno stato mutabile, ma sarebbero state espresse usando le classi nell'iniezione di dipendenza "standard"), possono quindi essere raggruppate in una classe statica (o "modulo" in VB parlance) .
Questo è tutto a posto, ma ho difficoltà a trovare il modo migliore per registrare questi metodi statici con Castle Windsor. Metodi senza dipendenze sono facili:
Component.For<DGetIntegers>().Instance(Integers.GetOneToTen)
Ma i nostri DataContextFunctions.GetProducts dall'alto ha alcune dipendenze. Il modo migliore che ho trovato per registrare questo è:
Component.For<DGetProducts>().UsingFactoryMethod(
kernel => DataContextFunctions.GetProducts(kernel.Resolve<DataContext>())
Questo può diventare piuttosto prolisso, e ovviamente dover chiedere il kernel direttamente per ogni tipo di dipendenza sconfigge il punto un po '. Mi sembra che siano disponibili tutte le informazioni statiche di cui un contenitore ha bisogno, quindi dovrebbe essere possibile farlo.
La domanda è: Castle Windsor (o qualsiasi altro contenitore) ha un modo semplice per fare ciò che ho perso, o ci sono problemi tecnici che sorgono, o è solo troppo di nicchia un caso d'uso per essere stato incluso?
Grazie, Krzysztof. Ci proverò qualche volta e riferirò sui risultati. Qualche link per un buon punto di partenza? – ninjeff
@ninjeff se sei su 2.5.x la documentazione dovrebbe farti iniziare docs.castleproject.org/(S(hucszcu5ilznbv45fvrim355))/... Se sei su 3.0 beta, ci sono state alcune modifiche API anche se i concetti sono ancora stesso. Fammi sapere se il documento non è perfetto –
Sono riuscito a farlo funzionare. Pubblicherò un link e una descrizione con la mia risposta in un'ora (gli utenti low-karma come me non possono rispondere alle nostre domande entro otto ore). – ninjeff