MVC3 Controller constructor + Ninject

11,751

Solution 1

It turns out that its not the Controller thats messing it up, but that Ninject dont Bind my generic Repository and IRepository correctly - I have therefore created a new post: Ninject + Bind generic repository

Solution 2

A short test showed that there is not problem with generic bindings in the MVC3 extension. I guess that the problem is not in the Controller but that the Repository can not be created because it has some unknown dependencies.

But this brought me to change the dependency resolver a bit to show the Ninject stacktrace whenever the requested type can be resolved but one of its dependencies fails to be resolved. Update to the latest version on the build server to get a better stack trace.

Solution 3

You will need to change the controller factory, as the regular MVC controller factory does not do DI.

You can look here for more information on how to setup MVC + Ninject: MVC3 + Ninject - How to?

Share:
11,751
ebb
Author by

ebb

Updated on June 04, 2022

Comments

  • ebb
    ebb almost 2 years

    I'm at the moment working on a MVC3 Web application and ecountered a new problem with Ninject.

    I'm using the following code in my controller:

    public class TestController : Controller
    {       
        public IRepository<CustomerModel> rep;
    
        public TestController(IRepository<CustomerModel> repository)
        {
            this.rep = repository;
        }
    
        public ActionResult Index()
        {
            return View();
        }
    }
    

    And my Ninject Module:

    public class RepositoryModule : NinjectModule
    {
        public override void Load()
        {
            Bind(typeof(IRepository<>)).To(typeof(Repository<>));
        }
    }
    

    However this just throws me "System.MissingMethodException: No parameterless constructor defined for this object." when I try to render the Index view.

    If I then add:

    public TestController() : this(new Repository<CustomerModel>(new XenCRMEntities())) { }
    

    so my actually TestController looks like:

    public class TestController : Controller
    {       
        public IRepository<CustomerModel> rep;
    
        public TestController() : this(new Repository<CustomerModel>(new XenCRMEntities())) { }
    
        public TestController(IRepository<CustomerModel> repository)
        {
            this.rep = repository;
        }
    
        public ActionResult Index()
        {
            return View();
        }
    }
    

    It works, but as you can see the new constructor pretty much break the whole point of IoC.

    How do I fix this?

    Thanks in advance.