Voglio usare HaveBox per Iniezione di Dipendenza. Ma non è una domanda su HaveBox. Così ho creato controller di base:Iniezione di dipendenza non sa del tipo che voglio iniettare
public abstract class BaseController : Controller
{
protected readonly IRepository m_Repository;
protected BaseController(IRepository repository)
{
m_Repository = repository;
}
}
E il mio HomeController è stato ereditato da BaseController
. Aggiungere HaveBoxConfig.RegisterTypes();
-Application_Start
metodo e la realizzazione di 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);
}
}
E il mio risolutore:
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);
}
}
Metodo GetService
chiamato per i prossimi tipi: IControllerFactory
, IControllerActivator
, HomeController
ma non per il mio IRepository
.
Cosa sto sbagliando? Perché DI non viene eseguito per IRepository
?
MVC non richiederà mai l'IRepository. Richiederà il 'HomeController'. È compito di HaveBox creare questo 'HomeController' con tutte le sue dipendenze. Non ho familiarità con HaveBox, ma forse 'HomeController' deve essere registrato in modo esplicito. E anche se HaveBox consente di risolvere tipi di calcestruzzo non registrati, è consigliabile registrare tutti i tipi di radice esplicitamente nel contenitore. – Steven