Bonsoir a tous,
J'ai un probleme/exercice de design et je tourne en rond pour le resoudre. Si quelqu'un peut me mettre sur la voix ...
J'ai un systeme qui permet a un utilisateur de communiquer avec une base de donnee. La BDD peut etre en locale, ou se trouve sur un autre reseau. En local, pas de probleme, j'ai reussi. A distance, je me suis lance dans une solution RMI et pas de probleme egalement, j'y suis arrive (de maniere isolee). Maintenant, je veux faire coexister les 2 solutions et c'est la que les choses se gatent, car quelque soit mon angle d'attaque, je me retrouve avec des interfaces/classes/methodes dupliquees et un casse-tete avec mes exceptions.
On part de l'interface (simplifiee) suivante :
Pour me simplifier la vie, je derive cette interface pour y ajouter des methodes qui seront utiles lorsqu'il faudra parler a la couche metier, et je l'implemente.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 package nuriel.db; public interface Database { public String[] read(int recNo) throws RecordNotFoundException; }
En local, la couche metier a juste a faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 package nuriel.db; public interface DataAccess extends Database { public int getTotalNbRecord(); } package nuriel.db; public class DB implements DataAccess { ...}pour travailler. Mais si je suis en reseau, il faut donc exporter un objet DataAccess depuis le serveur. Puisque je travaille en RMI, il faut donc que DataAccess descende de l'interface Remote, et donc que ces methodes lancent une RemoteException, ce qui est une violation du contrat avec Database.
Code : Sélectionner tout - Visualiser dans une fenêtre à part DabaAccess db = new DB();
Ma solution isolee qui marche a ete de dupliquer Database en DatabaseRemote, et toutes ses descendants, en incluant Remote et RemoteException des le depart.La couche metier l'utilise en
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 package nuriel.Remote; public interface DatabaseRemote extends Remote { public String[] read(int recNo) throws RecordNotFoundException, RemoteException; } package nuriel.remote; public interface DataAccessRemote extends DatabaseRemoter { public int getTotalNbRecord() throws RemoteException; } package nuriel.remote; public class DBRemote implements DataAccessRemote { ... }Et le probleme est que cette solution ne me convient pas car selon que je suis en local ou en reseau, l'objet db est d'un type different (DataAccess ou DataAccessRemote). Et je tourne en rond sur comment faire pour que db soit toujours un DataAccess quelque soit le mode d'access. Toutes propositions seront bienvenues.
Code : Sélectionner tout - Visualiser dans une fenêtre à part DatabaseAccessRemote db = (DatabaseRemote)registry.lookup(...);
Merci
Nuriel








Répondre avec citation
Partager