Pregunta

Para empezar estoy usando Ninject 1.5.Tengo dos proyectos:Proyecto Web y una biblioteca de Clase.Mi DI configuración dentro de la Web del proyecto.Dentro de mi biblioteca de clases tengo las siguientes:

    public interface ICacheService<T>
    {
            string Identifier { get; }
            T Get();
            void Set( T objectToCache, TimeSpan timeSpan );
            bool Exists();
    }

Y, a continuación, una clase concreta llamada 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 me tienen métodos de extensión para el HtmlHelper clase, 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 no se puede inyectar en las propiedades estáticas, en lugar debo utilizar Kernel.Obtener<>() - Sin embargo...Desde el código de arriba es en una biblioteca de clases no tengo acceso al Núcleo.¿Cómo puedo obtener el Núcleo a partir de este punto, o hay una mejor manera de hacer esto?

¿Fue útil?

Solución

Buena pregunta para hacerle.

La mitad de la idea de utilizar el DI es para quitar la preocupación/ajuste fino de la creación de instancias comportamiento desde el código de la inyección.Por lo tanto, puede tener más sentido para cambiar el Category clase a ya no ser static, declarar sus dependencias en un cto r y dejar que el código de cliente de la puntada juntos.

Con respecto a cómo acceder a él si estás realmente seguro de que es una buena idea...En general la idea sería en su caso, para crear un CacheServiceResolver y registrarlo [en su Proyecto Web].A continuación, pase el Kernel ejemplo como ser construido.De esa manera, su archivo DLL se limitan solamente a la interfaz de su CacheServiceResolver.

El otro enfoque a menudo es tener un último recurso 'Localizador de Servicio' en algún lugar de la instalación global, lo que expone a un 'GlobalGet'.Pero eso es en general Una Mala Idea y sólo debe ser utilizado temporalmente para Conducto de grabar fines.

La otra cosa a tener en cuenta es que el Común de Localizador de Servicio, que le permitirá a uno para hacer una biblioteca de contenedor neutro, a pesar de que fuera de EL, no te los vas a encontrar una gran cantidad de uso como usted no debe realmente mostrar su contenedor.

La otra opción es la demanda de un Func<T> método de fábrica y Bind que a una expresión lambda que resuelve, que la extracción de búsqueda de su código.

EDITAR:En Ninject 2, no hay necesidad de pasar explícitamente en Kernel instancias como he dicho - uno puede simplemente pedir una IKernel en su cto r y lo conseguirás, independientemente de si la solicitud de resolución de expclicitly pasa uno en.

EDIT 2:Realmente satisfecho con mi respuesta, han tratado de hacer más general sin matar mucho.El resumen es que la deseable opciones son, en general, en los siguientes en orden:

  1. ningún contenedor de artefactos, dejar de costura para el cliente
  2. proporcionar un contenedor neutro punto de extensión, adaptados específicamente para lograr algo en el contexto de la biblioteca uso de la terminología en el Lenguaje Omnipresente de su Biblioteca de Dominio en lugar de neutralizados resumen contenedor términos
  3. proporcionar un contenedor neutro enfoque de integración de la Común Localizador de Servicio
  4. sólo entonces considere la posibilidad de tener personas que necesitan
    • sabe que su contenedor
    • entender su contenedor

Otros consejos

En el proyecto web, ejecute el siguiente comando desde la consola de Package Manager.

Install-Package Ninject.MVC3

Debería terminar con un módulo NinjectWebCommon en la carpeta App_Start.

Hacia la parte inferior puede agregar sus dependencias como a continuación:

private static void RegisterServices(IKernel kernel)
{   
 kernel.Bind<IPeopleRepository>().To<PeopleRepository>();
}

Desde su proyecto de biblioteca de clases ejecute el siguiente comando:

Install-Package Ninject

Así es como se inyecta un servicio con un repositorio de la biblioteca de clases:

public class PeopleService : IPeopleService
{
 private readonly IPeopleRepository _peopleRepository;

 [Inject]
 public PeopleService(IPeopleRepository peopleRepository)
 {
    this._peopleRepository = peopleRepository;
 }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top