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>();
}
}
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 –