Sí, estaría bien registrar los componentes sin sus interfaces, pero no por la razón que da.
dependencias de hormigón
Puede suceder que los componentes dependen de clases concretas. Por ejemplo, con Entity Framework los consumidores deben tener el ObjectContext inyectado en ellos. Esa es una clase concreta que aún debe ser inyectada porque debe ser compartida entre varios consumidores.
Por lo tanto, teniendo en cuenta el constructor de un consumidor de esta manera:
public FooRepository(FooObjectContext objectContext)
que se necesita para configurar el contenedor de la siguiente manera:
container.Register(Component.For<FooObjectContext>());
Los FooRepository solicitudes ninguna interfaz lo que no tiene registro sentido una interfaz (aunque haya una disponible), pero aún debe registrar la clase concreta porque Windsor puede resolver solo los tipos explícitamente registrados.
Interfaces con una sola aplicación
Entonces, ¿qué acerca de las interfaces con una sola aplicación? Una vez más, el consumidor decide los requisitos.
Imagínese que un consumidor tiene este constructor:
public Ploeh(IBar bar)
La única forma de castillo de Windsor será capaz de resolver Ploeh es cuando se registra IBar. Incluso si Bar es la única aplicación de IBar, esto no funcionará:
container.Register(Component.For<Bar>());
Esto no funciona porque no se ha registrado IBar. A Castle Windsor no le importa que Bar implemente IBar porque no quiere intentar ser inteligente en su nombre. Debe informar explícitamente:
container.Register(Component.For<IBar>().ImplementedBy<Bar>());
Este mapas Ibar bar.
Registro de ambas interfaces y tipos concretos
Pues qué, si desea ser capaz de resolver tanto el tipo de hormigón y la interfaz?
El problema con el ejemplo anterior es que le permitirá resolver IBar, pero no Bar.
Usted puede utilizar el método Forward, o sobrecarga de multigenérica Para reenviar inscripciones:
container.Register(Component.For<Bar, IBar>().ImplementedBy<Bar>());
Esto permite resolver tanto bar y IBar.
Otro buen ejemplo sería Controladores en una aplicación MVC: no necesita abstraerlos. –
Sí, los controladores MVC son un ejemplo aún mejor: simplemente estaba sumida en algún código EF, así que me vino a la mente :) –
Gracias Mark, pero ¿qué ocurre si soy el desarrollador que crea la clase Bar si hago que tenga una interfaz ¿Es simplemente para que pueda registrarme en Windsor a través de la interfaz? ¿Por qué no simplemente registrar Bar en Windsor y hacer que Ploeh consuma Bar? –