2010-06-28 10 views
15

¿Se considera mala forma registrar componentes en Windsor sin especificar una interfaz? es decir¿Está bien registrar componentes en Windsor sin especificar una interfaz?

container.Register(Component.For<MyClass>().LifeStyle.Transient); 

en contraposición a ...

container.Register(Component.For<IMyClass>().ImplementedBy<MyClass>().LifeStyle.Transient); 

entiendo los beneficios de la codificación de una interfaz en lugar de una aplicación concreta sin embargo, nos encontramos con que ahora tenemos una gran cantidad de interfaces de muchos de ellos son en clases que de forma realista solo tendrán una implementación.

Respuesta

23

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.

+2

Otro buen ejemplo sería Controladores en una aplicación MVC: no necesita abstraerlos. –

+0

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 :) –

+0

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? –

Cuestiones relacionadas