2011-05-13 12 views
6

En el núcleo de nuestra aplicación, utilizamos Castle Windsor para administrar nuestras dependencias. Cargaremos complementos de terceros que pueden estar utilizando sus propios contenedores de IoC. Queremos que puedan recibir dependencias desde el núcleo, p. a través de la inyección del constructor de los servicios del núcleo, pero también recibir dependencias de su propio contenedor IoC.¿Puede Windsor cooperar con otro contenedor IoC?

Parece que si suministran una interfaz de proveedor de servicios, Windsor podría usarla para resolver dependencias desconocidas, ignorando los resultados (dado que la vida útil de estos componentes es asunto de otra persona) y continuar el transporte por carretera.

Pero también estoy seguro de que hay algunas sutilezas que surgen cuando intentas algo como esto.

+3

Esa es una muy mala idea. Mezclar contenedores es como mezclar alcoholes, nunca termina bien. –

+0

Ciertamente parece inducir a la resaca, pero seguramente no somos la primera aplicación que quiere usar un contenedor, sino hacer amistad con las bibliotecas que eligen otra. –

+0

Parece que estamos tratando de resolver el mismo problema aquí. Lea esta publicación: http://stackoverflow.com/questions/6238431/common-service-registry. ¿Has logrado encontrar una solución? –

Respuesta

6

Eso no es necesario. Si habilita esos complementos para usar Constructor Injection para obtener los servicios apropiados de su aplicación de host, Castle Windsor puede cablear correctamente el PlugIn. Los plugins simplemente usan Constructor Injection como una forma de declarar estáticamente una dependencia, de modo que mientras Windsor pueda resolver la dependencia, el PlugIn lo recibirá.

Lo que sucede dentro de cada PlugIn (incluido el uso de otros contenedores) no es una preocupación de la aplicación host.

+0

Pero esos programadores pueden desear usar IoC para registrar sus propias dependencias internas de las que el core IoC nunca ha oído hablar. –

+0

MEF aborda este tipo de problema mediante atributos. Si ese tipo de escenario de complemento es esencial para su aplicación, sería una mejor opción. –

+0

De hecho, el problema es que incluso si todos somos concienzudos y usamos la inyección de constructor para obtener nuestras dependencias, tenemos una situación en la que ningún contenedor tiene conocimiento de todas esas dependencias, por lo que no puede crear el objeto. No pude escribir un constructor para MyThing (ICoreService s, IMyPluginService p), ya que el contenedor central podría satify sy no p, y viceversa para el contenedor del complemento. –

Cuestiones relacionadas