简体   繁体   中英

Dependency Injection doesn't know about type that I want to inject

I want to use HaveBox for Dependency Injection. But it isn't question about HaveBox . So I created base 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 HaveBoxConfig.RegisterTypes(); to Application_Start method and implementation of HaveBoxConfig is:

 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);
        }
    }

Method GetService called for next types: IControllerFactory , IControllerActivator , HomeController but not for my IRepository .

What am I doing wrong? Why DI isn't executed for IRepository ?

You also need to implement a controller factory. 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);

I have checked different ways to solve it. Most simple is just add my controllers to container. For example:

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

It is simple and clear. If you have complex project and for more graceful solution you can do it via reflection for all classes that implemented IController interface.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM