Bonjour,
Nous sommes confrontés à un soucis de plus en plus récurent et ne trouvons aucune réponses claires.
La situation est la suivante :
Nous développons dans une architecture SOA dans laquelle chaque service est décrits par une interface. Nous retrouvons à chaque fois trois implémentations de celle-ci :
Au final, une classe business qui à besoin de se service se voit injecter le Service (qui est toujours le proxy).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public interface Service { // ... } public class ServiceMock implements Service { // ... } public class ServiceImpl implements Service { /** * @param Service the remote service create by Spring remote */ public ServiceImpl(Service serviceRemote) { // ... } // ... } public class ServiceProxy implements Service { public ServiceImpl(String mokOrImpl, Service serviceImpl, Service serviceMock) { if ( "mock".equals(mockOrImpl) ) { this.delegate = serviceMock; } else { this.delegate = serviceImpl; } } // ... }
Tout ceci est mis en place pour utiliser l'implémentation ou le mock en fonction d'un paramètre de configuration qui est injecté ("String mockOrImpl" de ServiceProxy).
Evidemment ce n'est pas une très bonne solution care elle implique que les deux implémentations "Mock" et "Impl" soient toujours instanciées alors que seulement une seras utilisée. Il y à aussi beaucoup de code dupliqué et de méthodes qui se contentent de déléguer à une autre implémentation.
La question :
Y à t'il un moyen plus simple d'utiliser l'une ou l'autre implémentation en utilisant Spring ? Nous supposons que oui (sans quoi l'avantage de Spring IOC est assez faible) mais personne (en interne) ne sais comment faire.
Notre objectif est de passer à un schéma plus simple ou l'unité business reçoit l'implémentation directe qui est soit le mock soit un remote généré par Spring.
Merci
Partager