Using Ninject DI for both api and "regular" controllers in MVC4

Possible duplicate:
MVC3 + Ninject - How?

In a small mvc 4 project, I am trying to inject dependency injection using ninject.

So far, I have worked with api controllers, but I have not been lucky with regular controllers.

I have a NinjectResolver:

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver { private readonly IKernel _kernel; public NinjectDependencyResolver(IKernel kernel) : base(kernel) { _kernel = kernel; } public IDependencyScope BeginScope() { return new NinjectDependencyScope(_kernel.BeginBlock()); } public override void Dispose() { _kernel.Dispose(); } } 

And NinjectScope:

 public class NinjectDependencyScope : IDependencyScope { protected IResolutionRoot ResolutionRoot; public NinjectDependencyScope(IResolutionRoot kernel) { ResolutionRoot = kernel; } public object GetService(Type serviceType) { var request = ResolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); return ResolutionRoot.Resolve(request).SingleOrDefault(); } public IEnumerable<object> GetServices(Type serviceType) { var request = ResolutionRoot.CreateRequest(serviceType, null, new Parameter[0], true, true); return ResolutionRoot.Resolve(request).ToList(); } public void Dispose() { var disposable = (IDisposable)ResolutionRoot; if (disposable != null) disposable.Dispose(); ResolutionRoot = null; } } 

Then I installed it in my Global.asax:

 var kernel = new StandardKernel(); kernel.Bind(typeof(IRepository)).To(typeof(Repository)); GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel); 

Then I insert the repository into the api controller as follows:

 private IRepository _repository; public TestApiController(IRepository repository) { _repository = repository; } 

This works fine, but doing the same in a regular controller fails with the error "Without parameters without constructor for this object."

Any ideas?

+4
source share
1 answer

ASP.NET MVC uses a different IDependencyResolver than ASP.NET WebAPi namelly Sytem.Web.Mvc.IDependencyResolver .

So, you need a new implementation of NinjectDependencyResolver for MVC controllers (fortunately, MVC and WepAPi IDependencyResolver almost have the same elements with the same signatures, so they are easy to implement)

 public class NinjectMvcDependencyResolver : NinjectDependencyScope, System.Web.Mvc.IDependencyResolver { private readonly IKernel _kernel; public NinjectDependencyResolver(IKernel kernel) : base(kernel) { _kernel = kernel; } } 

And then you can register it in Global.asax with:

 DependencyResolver.SetResolver(new NinjectMvcDependencyResolver(kernel)); 
+5
source

All Articles