2013-12-13 54 views
7

我想將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呼籲下一類型:IControllerFactoryIControllerActivatorHomeController但不適合我的IRepository

我在做什麼錯?爲什麼DI不執行IRepository

+0

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

回答

2

我檢查了不同的方法來解決它。最簡單的就是將我的控制器添加到容器中。例如:

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

這很簡單明瞭。如果你有複雜的項目和更優雅的解決方案,你可以通過反射來實現所有實現了界面的類。

2

您還需要實施控制器工廠。最簡單的方法是子類DefaultControllerFactory。你可以用Castle Windsor來檢查他們是如何做到的。然後你告訴ASP.NET MVC使用你的實現。

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

謝謝你的有趣的一點。 – RredCat