2010-12-05 11 views
16

Acabo de empezar a jugar con contenedores IoC y, por lo tanto, elegí Ninject.MVC3 + Ninject - ¿Cómo?

Después de varias horas de sudor y lágrimas, todavía no puedo entender cómo configurar mi aplicación MVC3 con Ninject.

hasta ahora tengo:

Global.asax.cs

public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

    } 

    protected void Application_Start() 
    { 
     DependencyResolver.SetResolver(new MyDependencyResolver(CreateKernel())); 
     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 

    protected override IKernel CreateKernel() 
    { 
     var modules = new [] { new ServiceModule() }; 
     return new StandardKernel(modules); 
    } 

} 

ServiceModule.cs 

internal class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IGreetingService>().To<GreetingService>(); 
    } 
} 

MyDependencyResolver.cs

public class MyDependencyResolver : IDependencyResolver 
{ 
    private IKernel kernel; 

    public MyDependencyResolver(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public object GetService(System.Type serviceType) 
    { 
     return kernel.TryGet(serviceType); 

    } 

    public System.Collections.Generic.IEnumerable<object> GetServices(System.Type serviceType) 
    { 
     return kernel.GetAll(serviceType); 

    } 
} 

GreetingService.cs

public interface IGreetingService 
{ 
    string Hello(); 
} 

public class GreetingService : IGreetingService 
{ 
    public string Hello() 
    { 
     return "Hello from GreetingService"; 
    } 
} 

TestController.cs

public class TestController : Controller 
{ 

    private readonly IGreetingService service; 

    public TestController(IGreetingService service) 
    { 
     this.service = service; 
    } 

    public ActionResult Index() 
    { 
     return View("Index", service.Hello()); 
    } 

} 

Cada vez que intento cargar la vista de índice, o bien arroja una excepción de desbordamiento o un error HTTP 404 - Si elimino todo el código de Ninject, funciona perfectamente, ¿qué ocurre?

Respuesta

15

Está mezclando un propio resolvedor de dependencias con la extensión MVC. Sugeriría que vaya con su propia resolución de dependencias o con el uso de la extensión MVC pero no con ambas. Al utilizar la extensión MVC, debe utilizar OnApplicationStarted en lugar de Application_Start.

Consulte http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ y eche un vistazo a SampleApplication que viene con el código fuente de la extensión MVC https://github.com/ninject/ninject.web.mvc.

También la solución ya no se utiliza cuando se utiliza la versión actual para el servidor de compilación: http://teamcity.codebetter.com


ACTUALIZACIÓN: El paquete Ninject.MVC3 se sigue actualizando y trabaja OOTB contra MVC4 RTM (y RC). Vea this page in the wiki para más detalles.

+0

¡Perfecto! - Sí se enteró con respecto a la resolución de la dependencia. – ebb

+0

-1. Fui a su enlace para descargar su aplicación de muestra. Le faltan archivos y no compilará –

+2

@Christian Payne. Todo está allí. ¡Solo lee el cómo también! El servidor de CI asegura que se puede compilar –