Dependency injection does not know about the type I want to enter

I want to use HaveBox for dependency injection. But this is not a question about HaveBox . So I created a basic controller:

public abstract class BaseController : Controller { protected readonly IRepository m_Repository; protected BaseController(IRepository repository) { m_Repository = repository; } } 

And my HomeController was inherited from BaseController . Add the HaveBoxConfig.RegisterTypes(); method HaveBoxConfig.RegisterTypes(); in Application_Start , and HaveBoxConfig implementation:

  public class HaveBoxConfig { public static void RegisterTypes() { var container = new Container(); container.Configure(config => config.For<IService>().Use<Service>()); container.Configure(config => config.For<IRepository>().Use<Repository>()); IDependencyResolver resolver = DependencyResolver.Current; var newResolver = new MyResolver(container, resolver); DependencyResolver.SetResolver(newResolver); } } 

And my resolver:

 public class MyResolver : IDependencyResolver { private readonly IContainer m_container; private readonly IDependencyResolver m_resolver; public MyResolver(IContainer container, IDependencyResolver resolver) { m_container = container; m_resolver = resolver; } public object GetService(Type serviceType) { try { return m_container.GetInstance(serviceType); } catch (Exception ex) { return m_resolver.GetService(serviceType); } } public IEnumerable<object> GetServices(Type serviceType) { return m_resolver.GetServices(serviceType); } } 

The GetService method calls the following types: IControllerFactory , IControllerActivator , HomeController , but not for my IRepository .

What am I doing wrong? Why is DI not running for IRepository ?

+7
c # dependency-injection asp.net-mvc asp.net-mvc-4 havebox
source share
2 answers

I tested various ways to solve it. The simplest thing is to simply add controllers to the container. For example:

 container.Configure(config => config.For<HomeController>().Use<HomeController>()); 

It is simple and clear. If you have a complex project and for a more graceful solution, you can do this using reflection for all classes in which the IController interface is IController .

+2
source share

You also need to implement a factory controller. The easiest way is to subclass DefaultControllerFactory . You can check how they do it with Castle Windsor . Then you tell ASP.NET MVC to use your implementation.

 DependencyResolver.SetResolver(newResolver); ControllerBuilder.Current.SetControllerFactory(controllerFactory); 
+2
source share

All Articles