He estado experimentando con el uso de delegados con nombre en lugar de interfaces de método único. Esto tiene algunas ventajas para el tamaño del código, ya que podemos pasar de (algunos saltos de línea retirados a fin de no exagerar el caso):¿Existe una manera simple de registrar cierres estáticos 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();
}
}
esto está teniendo básicamente la ventaja del hecho que una vez que avanzas lo suficiente con la inyección de dependencia, muchas clases se convierten en poco más que cierres. Esas clases se pueden reemplazar con funciones que devuelven lambdas. Conjuntos enteros de funciones relacionadas (que no necesitan encapsular ningún estado mutable, pero que se hubieran expresado usando clases en inyección de dependencia "estándar"), se pueden enrollar en una clase estática (o "módulo" en el lenguaje VB) .
Esto está muy bien, pero tengo problemas para encontrar la mejor manera de registrar estos métodos estáticos con Castle Windsor. Métodos sin dependencias son fáciles:
Component.For<DGetIntegers>().Instance(Integers.GetOneToTen)
Pero nuestros DataContextFunctions.GetProducts desde arriba tiene algunas dependencias. La mejor manera que he encontrado para registrar este es:
Component.For<DGetProducts>().UsingFactoryMethod(
kernel => DataContextFunctions.GetProducts(kernel.Resolve<DataContext>())
Esto puede llegar a ser muy detallado, y, obviamente, tener que pedir el kernel directamente para cada tipo de dependencia se pierde el punto un poco. Me parece que toda la información estática que un contenedor debería necesitar está disponible, por lo que debería ser posible hacerlo.
La pregunta es, ¿Castle Windsor (o cualquier otro contenedor) tiene una forma simple de hacer esto que me he perdido, o hay problemas técnicos que surgen, o es demasiado nicho como un caso de uso para haber sido ¿incluido?
Gracias, Krzysztof. Voy a intentarlo en algún momento e informar los resultados. ¿Algún enlace para un buen lugar para comenzar? – ninjeff
@ninjeff si está en 2.5.x, la documentación debe comenzar docs.castleproject.org/(S(hucszcu5ilznbv45fvrim355))/... Si tiene 3.0 beta, ha habido algunos cambios en la API, aunque los conceptos siguen siendo los mismo. Avíseme si el doco es menos que perfecto –
Pude hacerlo funcionar. Publicaré un enlace y una descripción con mi propia respuesta en una hora (los usuarios de bajo índice de karma como yo no podemos responder nuestras propias preguntas en ocho horas). – ninjeff