2011-05-27 11 views
5

Actualmente estoy probando Castle Windsor vs. Ninject, y realmente me gusta lo que Windsor tiene para ofrecer, solo estoy teniendo un problema con una inyección de repositorio.Castle windsor controller factory y repository no resuelve

Por lo tanto, aquí está la configuración ... Tengo un ControllersInstaller que tiene este aspecto ...

public class ControllersInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(FindControllers().Configure(ConfigureControllers())); 
    } 

    private BasedOnDescriptor FindControllers() 
    { 
     return AllTypes.FromThisAssembly() 
      .BasedOn<IController>() 
      .If(Component.IsInSameNamespaceAs<HomeController>()) 
      .If(t => t.Name.EndsWith("Controller")); 

    } 

    private ConfigureDelegate ConfigureControllers() 
    { 
     return c => c.LifeStyle.Transient; 
    } 
} 

Un instalador contexto que se parece a esto ...

public class ContextInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(AllTypes.FromThisAssembly() 
      .Where(t => t.Name == "MyContext")); 
    } 
} 

Y un acuerdo de recompra instalador que se parece a ...

public class RepoInstaller : IWindsorInstaller 
{ 

    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(AllTypes.FromThisAssembly() 
      .Where(type => type.Name.EndsWith("Repo")) 
      .WithService.DefaultInterface() 
      .Configure(c => c.LifeStyle.Singleton)); 
    } 
} 

Luego, en Global.asax les estoy registrando por ...

private static void BootstrapContainer() 
    { 
     var container = new WindsorContainer() // Create a container to hold the dependencies 
      .Install(
      new ContextInstaller(), 
      new RepoInstaller(), 
      new ControllersInstaller() 
      );  // Scan this assembly for all IWindsorInstaller 

     var controllerFactory = new WindsorControllerFactory(container.Kernel);  // Create a new instance 
     ControllerBuilder.Current.SetControllerFactory(controllerFactory);   // Use my factory instead of default 
    } 

Mi controlador de casa se ve como ...

public class HomeController : Controller 
{ 
    IMyRepo _repo; 

    public HomeController(MyRepo repo) 
    { 
     _repo = repo; 
    } 

Pero por alguna razón, cuando puedo depurar lo consigo ... Algunas dependencias de este componente no se pudo resolver de forma estática. MyProject.Controllers.HomeController está esperando las siguientes dependencias: Servicios: - MyProject.Models.MyRepo que no se ha registrado.

¡Y no puedo entender por qué! Intenté hacer que mi instalador repo se instalara como singleton, e intenté reordenar el proceso de registro para que el repositorio fuera configurado antes que los controladores.

Cuando depuro y pulso la línea de fábrica del controlador en Global.asax, dice que todo excepto HomeController se ha resuelto correctamente.

¿Pensamientos?

Respuesta

3

Si registra su repositorio incluyendo la interfaz .WithService.DefaultInterface() su dependencia tiene que basarse en la interfaz (tal vez IRepo) no en concreto.

Si su dependencia se basa en concreto, de eliminar .WithService.DefaultInterface() y así la dependencia será resuelto ... pero eso es Nont la mejor manera: a Descargas siempre tienen dependencia basado en la interfaz

1

Siempre Odio responder mi propia pregunta, pero a veces debe hacerse ...

¡Esto es algo pequeño pero estúpido que me he perdido! Resulta que el problema estaba en mis controladores. Estaba tratando de pasar el Repo real a mi constructor HomeController().

me cambiaron a

public ActionResult HomeController(IRepo repo) 
{ 
    _repo = repo; 
} 

Y eso era lo que necesitaba para trabajar ... UH ...

+1

En realidad, yo le respondió misma solución :-P Me alegro de que lo encontró en tu propio. ¡Diviértete con Windsor! – Crixo

+0

¡De nada! – Crixo

Cuestiones relacionadas