我想將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
?
MVC永遠不會請求'IRepository'。它會請求'HomeController'。 HaveBox的工作就是構建這個具有所有依賴項的'HomeController'。我對HaveBox不熟悉,但是'HomeController'可能需要明確註冊。即使HaveBox允許解析未註冊的具體類型,最好的做法是在容器中顯式註冊所有的根類型。 – Steven