C# 依赖注入不';我不知道我要注入的类型

C# 依赖注入不';我不知道我要注入的类型,c#,asp.net-mvc,asp.net-mvc-4,dependency-injection,havebox,C#,Asp.net Mvc,Asp.net Mvc 4,Dependency Injection,Havebox,我想用于依赖项注入。但这不是问题。所以我创建了基本控制器: public abstract class BaseController : Controller { protected readonly IRepository m_Repository; protected BaseController(IRepository repository) { m_Repository = repository;

我想用于依赖项注入。但这不是问题。所以我创建了基本控制器:

public abstract class BaseController : Controller
    {
        protected  readonly IRepository m_Repository;

        protected BaseController(IRepository repository)
        {
            m_Repository = repository;
        }
    }
我的HomeController是从
BaseController
继承的。添加HaveBoxConfig.RegisterTypes()
应用程序启动
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类HaveBoxConfig
{
公共静态无效注册表类型()
{
var container=新容器();
container.Configure(config=>config.For().Use());
container.Configure(config=>config.For().Use());
IDependencyResolver解析器=DependencyResolver.Current;
var newResolver=newmyresolver(容器,解析器);
DependencyResolver.SetResolver(新解析器);
}
}
我的解析器:

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);
        }
    }
公共类MyResolver:IDependencyResolver
{
专用只读i容器m_容器;
私有只读IDependencyResolver Mu resolver;
公共MyResolver(IContainer容器、IDependencyResolver解析器)
{
m_容器=容器;
m_解析器=解析器;
}
公共对象GetService(类型serviceType)
{
尝试
{
返回m_container.GetInstance(serviceType);
}
捕获(例外情况除外)
{
返回m_resolver.GetService(serviceType);
}
}
公共IEnumerable GetServices(类型serviceType)
{
返回m_resolver.GetServices(serviceType);
}
}
方法
GetService
为以下类型调用:
IControllerFactory
IControllerActivator
HomeController
,但不用于my
IRepository


我做错了什么?为什么不为IRepository执行DI?

您还需要实现一个控制器工厂。最简单的方法是子类化。你可以检查一下他们是怎么做的。然后告诉ASP.NET MVC使用您的实现

DependencyResolver.SetResolver(newResolver);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);

我检查了不同的解决方法。最简单的方法就是将我的控制器添加到容器中。例如:

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

它简单明了。如果您有一个复杂的项目,并且要获得更优雅的解决方案,您可以通过反射实现
IController
接口的所有类来实现它。

MVC永远不会请求
IRepository
。它将请求
家庭控制器
。HaveBox的工作是构建这个
HomeController
及其所有依赖项。我不熟悉HaveBox,但可能必须明确注册
HomeController
。即使HaveBox允许解析未注册的具体类型,它的最佳实践是在容器中显式注册所有根类型。