Seiten

Mittwoch, 17. Juli 2013

CDI Commons – Dynamic Service Resolver

In meinem Blog vom 26.6.2013 habe ich über die Möglichkeit geschrieben, wie man zur Laufzeit die
Implementierung auswählen kann die in die entsprechende Stelle injected wird.
Es war immer noch notwendig die Producer anzupassen wie in dem Beispiel des SimpleDateFormatterProducer
image

Gleich mehrere Dinge die nicht angenehm sind.
1) der ContextResolver ist hier hart per Qualifier angegeben.
2) Die Implementierung eines Constructors selbst
3) Lazy-Init des AttributespropertyregistryService
4) fehlende Default Implementierung

Aus Sicht der Entwickler wäre folgendes wünschenswert.
Ein Inject des PropertyregistryService mit folgender Anweisung:
image
Um das zu erreichen wird die Klasse PropertyRegistryServiceProducer implementiert.
Hier wird ein allgemeiner Producer für den PropertyregistryServcie geschrieben.
image

zwei Dinge sind hier von Bedeutung:
1) Der Inject einer Default-Implementierung , in diesem Fall der Inject einer FileBasedRegistry
2) Der Inject einers ContextResolvers mit @Any und @Default
Nun kann zur Laufzeit der ContextResolver ausgewertet werden um die Endscheidung zu treffen welche Implementierung verwendet werden soll.
Der ContextResolver selbst wird wohl immer eine spezialisierte Implementierung in einem Projekt darstellen und muss deshalb selbst Implementiert werden.
Eine Default-Implementierung ist dem Projekt als Beispiel in den test – Foldern beigelegt. (DefaultPropertyContextResolver)
image