2011-03-15 10 views
14

Quiero configurar Ninject para hacer una prueba simple, así como demostrar la facilidad de configuración con Nuget. Quiero resolver un servicio de muestra.Ninject.MVC3, Nuget, WebActivator oh my

public interface ITestService 
{ 
    string GetMessage(); 
} 
public class TestService : ITestService 
{ 
    public string GetMessage() { return "hello world"; } 
} 

corro el NuGet Instalar Paquete NinjectMVC3 .... se cae muy bien NinjectMVC3.cs en mi carpeta App_Start, decorado con algunos atributos WebActivator conseguirlo todo cargado.

A continuación añado mi unión en el método NinjectMVC3.RegisterServices:

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

Ahora quiero 'uso' Ninjet para resolver mi ITestService.

public ActionResult Index() 
{ 
    //[Ninject, give me the service I need] 
    ITestService service = ??? 

    ViewBag.Message = service.GetMessage(); 
    return View(); 
} 

¿Hay alguna otra parte en la configuración de Ninject? ¿Debo proporcionar una resolución?

¿Cuál es el código que necesito para resolver mi ITestService?

thanksasking ayuda »

** * * * * * * * * * * * Actualizar: * * * * * * * * * * * * * * * * **

Gracias por las grandes respuestas con respecto a la inyección del "constructor controlador". Simplemente agregando un constructor con ITestServcice como param .... ¡BAMM!

private ITestService _service; 

public HomeController(ITestService service) 
{ 
    _service = service 
} 
public ActionResult Index() 
{ 
    ViewBag.Message = _service.GetMessage(); 
    return View(); 
} 

Ahora, ¿cuál es la solución ideal para cuando necesito obtener el kernel directamente?

var kernel = ... // Go grab the kernel from ????? (thanks Judah). 
ITestService service = kernel.Get<ITestService>(); 

puedo ver la clase NinjectMVC3 crea el kernel, pero no mantiene o exponer una referencia a él, ni puedo encontrar una clase/método obvio para 'conseguir el núcleo'.

Supongo que hay una forma Ninject de conseguirlo, pero no estoy seguro.

** * * * * * * * * * * * (Final) Actualización: * * * * * * * * * * * * * * * * **

Gracias de nuevo por las respuestas y comentarios ....

Corrección: La clase NinjectMVC3 crea el Kernel, y mantiene la referencia al 'Bootstrapper', que como un IKernel en él.

Así que agregué un método de "resolución" a la clase App_Start/NinjectMVC3 ... funciona muy bien.

public static class NinjectMVC3 /// created by the NinjectMVC3 NuGet Packagae 
{ 
    // add method to provide a global resolver. 
    public static T Resolve<T>() 
    { 
     return bootstrapper.Kernel.Get<T>(); 
    } 
} 
+5

Este es sin duda una cuestión de opinión, pero el método estático su NinjectMVC3.Resolve es un ejemplo de la anti-patrón de servicio de localización. En términos generales, la inyección de dependencia debe ser un tipo de "decir, no preguntar". Mark Seemann discute esto en su blog, lo que podría ayudar a aclarar un poco las cosas. http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx –

Respuesta

4

Añadir la ITestService como un parámetro de constructor para su controlador:

private ITestService service; 

public MyController(ITestService service) 
{ 
    this.service = service; 
} 

public ActionResult Index() 
{ 
    ViewBag.Message = this.service.GetMessage(); 
    return View(); 
} 

Ninject inyectará automáticamente el ITestService en el controlador. Luego use el campo de servicio dentro de su método de índice.


Alternativamente, si usted no quiere Ninject para inyectar en su constructor de controlador, puede mantener todo el núcleo se crea, a continuación, dentro de su método de Índice, se llama núcleo.Obtener <ITestService>() para tomar una instancia:

public ActionResult Index() 
{ 
    var kernel = ... // Go grab the kernel we created back in app startup. 
    ITestService service = kernel.Get<ITestService>(); 

    ViewBag.Message = service.GetMessage(); 
    return View(); 
} 

Tenga una mirada en Ninject dependency inject for controllers in MVC3.

+0

Gracias, eso tiene sentido. Ahora, ¿cuál sería una buena práctica para mantener el kernel? Use un singleton como tienda global? – Rob

+1

Personalmente, tengo una clase estática llamada Dependencia, con un solo método: Obtenga . Eso internamente llama al método Get del kernel. El código de consumo se ve así: Dependency.Get () –

+0

Gracias de nuevo por el resposne. – Rob

16

Pasos:

  1. crear un nuevo proyecto de ASP.NET MVC 3
  2. instalar el paquete NuGet desde la consola del paquete: Install-Package Ninject.MVC3
  3. En HomeController:

    public class HomeController : Controller 
    { 
        private readonly ITestService _service; 
        public HomeController(ITestService service) 
        { 
         _service = service; 
        } 
    
        public ActionResult Index() 
        { 
         ViewBag.Message = _service.GetMessage(); 
         return View(); 
        } 
    } 
    
  4. En App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<ITestService>().To<TestService>(); 
    }  
    
+0

Gracias, parece bastante sencillo. Ahora, ¿cuál sería una buena práctica para mantener el kernel? Use un singleton como tienda global? – Rob

Cuestiones relacionadas