[英]Dependency Injection doesn't know about type that I want to inject
I want to use HaveBox for Dependency Injection. 我想使用HaveBox进行依赖注入。 But it isn't question about HaveBox . 但这不是关于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
. 我的HomeController继承自BaseController
。 Add HaveBoxConfig.RegisterTypes();
添加HaveBoxConfig.RegisterTypes();
to Application_Start
method and implementation of HaveBoxConfig
is: 到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);
}
}
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
. 方法GetService
调用下一个类型: IControllerFactory
, IControllerActivator
, HomeController
但不适用于我的IRepository
。
What am I doing wrong? 我究竟做错了什么? Why DI isn't executed for IRepository
? 为什么没有为IRepository
执行DI?
You also need to implement a controller factory. 您还需要实现一个控制器工厂。 Easiest way is to subclass DefaultControllerFactory . 最简单的方法是子类DefaultControllerFactory 。 You can check how they do it with Castle Windsor . 您可以查看Castle Windsor如何做到这一点。 Then you tell ASP.NET MVC to use your implementation. 然后,您告诉ASP.NET MVC使用您的实现。
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. 如果您有复杂的项目和更优雅的解决方案,您可以通过反射实现IController
接口的所有类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.