Para empezar estoy usando Ninject 1.5. Tengo dos proyectos: proyecto web y una biblioteca de clase. Mi configuración DI está dentro del proyecto web. Dentro de mi biblioteca de clases tengo el siguiente define:Ninject: ¿Cómo puedo inyectar en una biblioteca de clases?
public interface ICacheService<T>
{
string Identifier { get; }
T Get();
void Set(T objectToCache, TimeSpan timeSpan);
bool Exists();
}
Y entonces una clase concreta llamado CategoryCacheService.
En mi proyecto web que se unen los dos:
Bind(typeof(ICacheService<List<Category>>)).To(typeof(CategoryCacheService)).Using<SingletonBehavior>();
En mi biblioteca de clases que tengo métodos de extensión para la clase HtmlHelper, por ejemplo:
public static class Category
{
[Inject]
public static ICacheService<List<Category>> Categories { get; set; }
public static string RenderCategories(this HtmlHelper htmlHelper)
{
var c = Categories.Get();
return string.Join(", ", c.Select(s => s.Name).ToArray());
}
}
Me han dicho que usted no puedo inyectar en propiedades estáticas, en su lugar debería usar Kernel.Get <>() - Sin embargo ... Como el código anterior está en una biblioteca de clases, no tengo acceso al Kernel. ¿Cómo puedo obtener el Kernel a partir de este punto o hay una mejor manera de hacerlo?
Ruben, el CacheServiceResolver parece ser la idea correcta para mí desde Puedo volver a usar ese patrón en el futuro. ¿Tiene algún ejemplo sobre la configuración de un resolver? – DennyFerra
Lamentablemente no tengo uno a mano. La idea general sería que, donde sea que esté creando su nuevo StandardKernel, oculte una referencia a él. Luego tiene algo tan simple como 'void RegisterCacheServiceResolver (Kernel kernel) {Bind(). ToConstant (new CacheServiceResolver (kernel));}' en uno de los módulos, a los que pasa el kernel. O podría crear el Kernel, y luego pasarlo al constructor de cualquier Módulo que lo necesite, después de lo cual usted agregará el Módulo [en lugar de pasarlos todos al constructor de Kernel como normalmente lo hace]. –