2011-07-27 9 views
8

He este escenario, tengo tres servicios declarativos que proporcionan la misma interfaz (por ejemplo un interfaz del lector y no tengo readerimpl1-base de datos- readerimpl2-plana Archivo- readerimpl3-memoria). Quiero tener un consumidor que se vincule solo a la implementación de la base de datos. En la definición del componente le damos un nombre, así que estoy bastante seguro de que el nombre está en el registro, así que si tuviera que agregar un método de activación, puedo buscar desde el contexto del componente usando el nombre.servicio OSGi declarativa condicional vinculante

quiero probar a ella a través de la bind/desvincular a pesar de usar el nombre del servicio como parámetro. Estoy bastante seguro de que se puede usar el parámetro "objetivo" en el elemento de referencia del componente para hacer esto, pero no he encontrado cómo usarlo.

nadie ha hecho esto?

Esto sería similar al uso de @Reference (nombre-mapeado = "foo")

+0

Esta es una pregunta muy interesante. Me hace pensar en la pregunta relacionada de si * prefiere * la base de datos impl pero aceptará otra. En ese escenario, puede implementar a través de @Reference (cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC) y luego examinar la lista en sus métodos add/remove. –

Respuesta

14

Target es simplemente una OSGi filter. Puede usarlo para filtrar por cualquier propiedad de servicio. Por lo tanto, si los servicios tienen propiedad denominada backend con los valores file o database, puede enlazar con el siguiente objetivo:

<scr:reference ... target="(backend=database)"/> 

Y el servicio de back-end propia base de datos se registrará como:

<scr:component ...> 
    ... 
    <property name="backend" type="String" value="database"/> 
</scr:component> 
Cuestiones relacionadas