依赖注入不知道我想要注入的类型
我想使用HaveBox进行依赖注入。 但这不是关于HaveBox的问题。 所以我创建了基本控制器:
public abstract class BaseController : Controller
    {
        protected  readonly IRepository m_Repository;
        protected BaseController(IRepository repository)
        {
            m_Repository = repository;
        }
    }
  我的HomeController是从BaseController继承的。  添加HaveBoxConfig.RegisterTypes();  到Application_Start方法和HaveBoxConfig实现是: 
 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);
        }
    }
我的解决方案:
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);
        }
    }
  方法GetService需要下一个类型: IControllerFactory , IControllerActivator , HomeController但不适用于我的IRepository 。 
  我究竟做错了什么?  为什么DI不能执行IRepository ? 
您还需要实施控制器工厂。 最简单的方法是子类DefaultControllerFactory。 你可以查看他们如何与温莎城堡做到这一点。 然后你告诉ASP.NET MVC使用你的实现。
DependencyResolver.SetResolver(newResolver);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
我检查了不同的方法来解决它。 最简单的就是将我的控制器添加到容器中。 例如:
container.Configure(config => config.For<HomeController>().Use<HomeController>());
  它很简单明了。  如果你有复杂的项目和更优雅的解决方案,你可以通过反射来实现所有实现IController接口的类。 
上一篇: Dependency Injection doesn't know about type that I want to inject
