2013-12-13 13 views
7

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?

+0

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

risposta

2

Ho verificato diversi modi per risolverlo. Più semplice è aggiungere i miei controller al contenitore. Ad esempio:

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

È semplice e chiaro. Se hai un progetto complesso e per una soluzione più aggraziata puoi farlo tramite riflessione per tutte le classi che hanno implementato l'interfaccia IController.

2

È inoltre necessario implementare una fabbrica di controllori. Il modo più semplice è quello di sottoclasse DefaultControllerFactory. Puoi verificare come lo fanno con Castle Windsor. Quindi comunica a ASP.NET MVC di utilizzare la tua implementazione.

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

Grazie per il punto interessante. – RredCat