[英]Dependency Injection doesn't know about type that I want to inject
我想使用HaveBox進行依賴注入。 但這不是關於HaveBox的問題。 所以我創建了基本控制器:
public abstract class BaseController : Controller
{
protected readonly IRepository m_Repository;
protected BaseController(IRepository repository)
{
m_Repository = repository;
}
}
我的HomeController繼承自BaseController
。 添加HaveBoxConfig.RegisterTypes();
到HaveBoxConfig
Application_Start
方法和實現是:
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
。
我究竟做錯了什么? 為什么沒有為IRepository
執行DI?
您還需要實現一個控制器工廠。 最簡單的方法是子類DefaultControllerFactory 。 您可以查看Castle Windsor如何做到這一點。 然后,您告訴ASP.NET MVC使用您的實現。
DependencyResolver.SetResolver(newResolver);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
我已經檢查了不同的解決方法。 最簡單的只是將我的控制器添加到容器中。 例如:
container.Configure(config => config.For<HomeController>().Use<HomeController>());
它簡單明了。 如果您有復雜的項目和更優雅的解決方案,您可以通過反射實現IController
接口的所有類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.