Search code examples
asp.netasp.net-mvcdependency-injectionasp.net-mvc-5ninject

Why am I getting MissingMethodException even though I inject dependencies with ninject?


When I try to access the Exams view, I get this error. I don't understand, because everything seems to be ok.

Error:

[MissingMethodException: No constructor without parameters has been 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, StackCrawlMark & ​​stackMark) +122 System.RuntimeType.CreateInstanceDefaultCtor (Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark & ​​stackMark) +239 System.Activator.CreateInstance (Type type, Boolean nonPublic) +85 System.Activator.CreateInstance (Type type) +12 System.Web.Mvc.DefaultControllerActivator.Create (RequestContext requestContext, Type controllerType) +55

[InvalidOperationException: An error occurred when trying to create a controller of type 'ConsultaH.MVC.Controllers.ExamesController'. Make sure the controller has a parameterless public constructor.] System.Web.Mvc.DefaultControllerActivator.Create (RequestContext requestContext, Type controllerType) +178 System.Web.Mvc.DefaultControllerFactory.GetControllerInstance (RequestContext requestContext, Type controllerType) +80 System.Web.Mvc.DefaultControllerFactory.CreateController (RequestContext requestContext, String controllerName) +102 System.Web.Mvc.MvcHandler.ProcessRequestInit (HttpContextBase httpContext, IController & controller, IControllerFactory & factory) +188 System.Web.Mvc.MvcHandler.BeginProcessRequest (HttpContextBase httpContext, AsyncCallback callback, Object state) +50 System.Web.Mvc.MvcHandler.BeginProcessRequest (HttpContext httpContext, AsyncCallback callback, Object state) +48 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (HttpContext context, AsyncCallback cb, Object extraData) +16 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +105 System.Web.HttpApplication.ExecuteStepImpl (IExecutionStep step) +50 System.Web.HttpApplication.ExecuteStep (IExecutionStep step, Boolean & completedSynchronously) +163

My code inside NinjectWebCommon.cs:

private static void RegisterServices(IKernel kernel)
{
            kernel.Bind(typeof(IAppServiceBase<>)).To(typeof(AppServiceBase<>));
            kernel.Bind<IPacienteAppService>().To<PacienteAppService>();
            kernel.Bind<IExameAppService>().To<ExameAppService>();
            kernel.Bind<ITipoExameAppService>().To<TipoExameAppService>();
            kernel.Bind<IConsultaAppService>().To<ConsultaAppService>();

            kernel.Bind(typeof(IServiceBase<>)).To(typeof(ServiceBase<>));
            kernel.Bind<IPacienteService>().To<PacienteService>();
            kernel.Bind<IExameService>().To<ExameService>();
            kernel.Bind<ITipoExameService>().To<TipoExameService>();
            kernel.Bind<IConsultaService>().To<ConsultaService>();

            kernel.Bind(typeof(IRepositoryBase<>)).To(typeof(RepositoryBase<>));
            kernel.Bind<IPacienteRepository>().To<PacienteRepository>();
            kernel.Bind<IExameRepository>().To<ExameRepository>();
            kernel.Bind<ITipoExameRepository>().To<TipoExameRepository>();
            kernel.Bind<IConsultaRepository>().To<ConsultaRepository>();

}

My ExamesController.cs class:

public class ExamesController : Controller
{
        private readonly IExameAppService _exameApp;       

        public ExamesController(IExameAppService exameApp)
        {
            _exameApp = exameApp;            
        }

        // GET: Exame
        public ActionResult Index()
        {
            var exames = _exameApp.GetAll();
            var exameViewModel = Mapper.Map<IEnumerable<Exame>, IEnumerable<ExameViewModel>>(exames);            

            return View(exameViewModel);
        }
}    

I put a breakpoint in the class NinjectWebCommon.cs in the method CreateKernel() and always is given an error when reaching the first line after the attempt, this error occur at run time. See code below:

private static IKernel CreateKernel()
{
            var kernel = new StandardKernel();
            try
            {
                kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel); // <= This line
                kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
                RegisterServices(kernel);
                return kernel;
            }
            catch
            {
                kernel.Dispose();
                throw;
            }
}

I researched a lot and I can't find any solution in this case.


Solution

  • All I had to do to resolve this error was to uninstall the Ninject default package and install a package called Ninject MVC5.