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