Pregunta

Primero, estoy usando Ninject 2.0

Tengo mi página maestra en la que me gustaría inyectar pero no estoy muy seguro de cómo. Lo que probé fue crear una clase que deriva de System.Web.Mvc.ViewMasterPage y luego creo mis propiedades:

[Inject]
public ICacheService<List<Category>> Categories { get; set; }
[Inject]
public IConfigurationSettings Config { get; set; }

Cuando ejecuto mi página, ninguna de las propiedades se establece y ambas son nulas. ¿Alguna idea sobre por qué o ejemplo sobre cómo hacer esto? Gracias

- Actualizar

Así que he investigado más y parece que necesito resolver los objetos dentro de la clase yo mismo porque Ninject no intercepta la creación de la clase. Entonces, mi pregunta es ¿cómo creo un solucionador para mi kernel? El código anterior está dentro de una biblioteca de clases, así que no tengo una referencia al núcleo. Intenté lo siguiente: (ligeramente modificado de http://www.codethinked.com/post/2009/10/07/Our-Biggest-Enemy -Isne28099t-Developers-Who-Refuse-To-Move-Forward-It-is-Developers-Who-Pretend-To-Move-Forward.aspx )

public class KernelResolver
{
    private static IKernel _kernel;

    public KernelResolver(IKernel kernel)
    {
        _kernel = kernel;
    }

    public static T Resolve<T>()
    {
        return _kernel.Get<T>();
    }
}

y luego registrado:

Bind<KernelResolver>().ToSelf()

Sin embargo, el núcleo es nulo ... Solo necesito ver algunos ejemplos, pero no puedo encontrar ninguno o podría estar tan confundido que no sé lo que estoy buscando: \

¡Cualquier ayuda es muy apreciada!

¿Fue útil?

Solución

Comenzaré preguntando: ¿por qué quieres inyectar algo en una página maestra? Si está utilizando MVC, realmente desea utilizar modelos para pasar datos a sus vistas (incluida la página maestra) a través de un controlador. Esa es la esencia de un marco MVC, si tal vez demasiado simplificado.

Lo que Ninject u otros contenedores IoC pueden hacer por usted es ayudarlo a crear sus clases de controlador e inyectar dependencias en ellos; de hecho, el punto de integración para los contenedores IoC en ASP.Net generalmente se hace cargo de la responsabilidad de la fábrica de controladores.

Inyectar dependencias apropiadas en su controlador puede ayudar al controlador a determinar el modelo o estado apropiado del modelo para pasar a sus vistas (incluida la página maestra).

Me gusta pensar que el patrón MVC (y, para el caso, ASP.Net MVC) asigna la responsabilidad de toda la toma de decisiones (es decir, control ) en las clases de controlador. Las decisiones llevadas a cabo por los controladores pueden estar formadas por numerosas entradas (por ejemplo, configuración, entrada del usuario, entorno, etc.) pero en algún momento, el controlador pasa un modelo a una vista. Pienso en el modelo que contiene el estado del tema del sistema. Los puntos de vista, en mi opinión, especialmente en ASP.Net MVC se ven mejor como desprovistos de cualquier lógica y más como 'scripts'. que las clases verdaderas o los cititzens de primera clase en algún modelo de objeto.

Quizás tenga una razón válida para hacer que su página maestra de vista sea más inteligente, pero, por lo general, los tipos de cosas que desea inyectar se inyectan mejor en su controlador y los datos necesarios se pasan a su vista. Me gustaría saber más sobre lo que estás tratando de lograr.

Nota: puede configurar fácilmente la integración de Ninject con MVC para inyectar todas las dependencias de sus controladores. Echa un vistazo a este StackOverflow pregunta / respuesta para los detalles.

Otros consejos

La clase KernelResolver implementa un patrón de localización de servicios (preguntando algo [central] por sus dependencias), que generalmente es más un último recurso que un enfoque primario. Lo que realmente desea es que su inyección de dependencia funcione.

Definitivamente no Bind KernelResolver a nada: actúa como el contenedor general, y el sistema (por ejemplo, las fábricas de MVC) necesita estar conectado para que funcione ayuda.

Los atributos [Inject] no hacen nada mágico por sí solos: Ninject los usa cuando alguien solicita que inyecte un objeto de ese tipo.

Lo que está buscando es un ejemplo de cómo le dice a MVC que llame a Ninject en el momento adecuado, lo que le dejaré buscar (¿ninject " asp.net mvc " example?).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top