簡體   English   中英

依賴注入不知道我想要注入的類型

[英]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調用下一個類型: IControllerFactoryIControllerActivatorHomeController但不適用於我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM