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 призвал следующих типов: IControllerFactory, IControllerActivator, HomeController но не для моего IRepository.

Что я делаю неправильно? Почему DI не выполняется для IRepository?

+0

MVC никогда не будет запрашивать 'IRepository'. Он запросит 'HomeController'. Это работа над созданием этого «HomeController» со всеми его зависимостями. Я не знаком с HaveBox, но, возможно, «HomeController» должен быть зарегистрирован явно. И даже если DoBox позволяет разрешать незарегистрированные конкретные типы, лучше всего зарегистрировать все корневые типы явно в контейнере. – Steven

ответ

2

Я проверил различные способы его решения. Самое простое - просто добавить контроллеры в контейнер. Например:

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

Это просто и ясно. Если у вас сложный проект и для более грациозного решения вы можете сделать это через отражение для всех классов, которые реализовали интерфейс IController.

2

Вам также необходимо внедрить фабрику контроллера. Самый простой способ - подкласс DefaultControllerFactory. Вы можете проверить, как они это делают с Castle Windsor. Затем вы указываете ASP.NET MVC использовать вашу реализацию.

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

Спасибо за интересный момент. – RredCat

Смежные вопросы