2

I tried to inject dependencies into a controller's constructor, as i have previously. The problem is that i can't seem to get it to work. Is there any new requirement when doing DI with MVC 4 or am i missing some basic requirement ?

I'm using:
Ninject.MVC3 3.0.0.6
System.Web.MVC 4.0.0.0

Here are the important sections for that matter:


NinjectWebCommon.cs

  public static class NinjectWebCommon{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel){
        kernel.Bind<Handling.EventHandler>().To<EventDtoHandler>();
        kernel.Bind<CommandHandler>().To<CommandDtoHandler>();
        kernel.Bind<Mapper>().To<DtoMapper>().InSingletonScope();
        kernel.Bind<Serializer>().To<DtoSerializer>();
        kernel.Bind<Deserializer>().To<DtoDeserializer>();
        kernel.Bind<CommandQueue>().To<DeviceCommandQueue>();
        kernel.Bind<Dispatcher>().To<EventDispatcher>();
        kernel.Bind<Instantiator>().To<DtoInstantiator>();
        kernel.Bind<Template>().To<NmsTemplate>().InSingletonScope();
    }   
}


Global.asax:

 public class Global : HttpApplication {

    protected void Application_Start() {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }

    public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

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


The Controller:

public class EventController : Controller{
    private readonly EventHandler eventDtoHandler;

    public EventController(EventHandler eventDtoHandler){
        this.eventDtoHandler = eventDtoHandler;
    }

    ...
    Some Actions
    ...
}


I get:

[MissingMethodException: No parameterless constructor defined for this object.] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 System.Activator.CreateInstance(Type type, Boolean nonPublic) +69 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67

[InvalidOperationException: An error occurred when trying to create a controller of type 'Web.Controllers.EventController'. Make sure that the controller has a parameterless public constructor.] System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182 System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80

Seems to me that Ninject dont get the ControllerFactory responsibility..

zirus
  • 313
  • 3
  • 13
  • You are probably using the new Web API. Take a look at this related question: http://stackoverflow.com/questions/11347152/simpleinjector-injection-does-not-work-with-mvc-4-asp-net-web-api. – Steven Jul 12 '12 at 08:35

0 Answers0