0

Je suis actuellement aux prises avec la question de savoir si j'ai atteint un bon niveau de séparation, ou si j'ai raté quelque part, car je suis relativement nouveau pour apprendre le côté discipliné du développement ...Existe-t-il un moyen acceptable de séparer ces couches/dépendances?

Mon L'objectif quand j'ai commencé était de créer une couche agnostique de tout mécanisme de persistance - j'ai appelé cette API de données. J'ai ensuite implémenté ces interfaces en utilisant JDO, et j'ai appelé ce projet data-jdo. La couche logique parle idéalement seulement de data-api.

C'est le point où je ne suis pas sûr de ce qui est logique. La couche logique métier doit être invoquée d'une manière ou d'une autre, n'est-ce pas? Alors est-ce que l'on s'attend à ce que l'implémentation de l'API de données (data-jdo, ou autre chose en fonction de l'expérimentation) soit fournie (appropriée pour dire/injecter?) Par l'invocateur? Donc, le but serait (en grande partie pour l'expérience et non pour la productivité) de mettre en œuvre un paquet data-jpa qui pourrait être substitué à la place de data-jdo. Ainsi, la couche supérieure (un service Web, une méthode principale générique dans le cadre d'un outil, des tests unitaires, etc.) est celle qui choisit quelle implémentation utiliser. Dois-je utiliser un framework comme Spring pour me permettre de choisir quelle implémentation de mes API est utilisée, via XML?

Désolé si c'est un peu vague ... Je suppose que la question fondamentale est, à quel point le consommateur d'une API dépend, fournit, ou devenir jumelé avec, la mise en œuvre de cette API? Si la réponse est ou devrait être "jamais" alors qu'est-ce qui est utilisé pour s'assurer que tout est disponible au moment de l'exécution et comment le consommateur obtient-il une instance de ce que "l'API" décrit avec seulement des interfaces?

Répondre

1

Je viens d'un arrière-plan .net - pas un Java, donc je crains de ne pas pouvoir vous aider avec les spécificités Java.

La couche logique métier doit être invoquée en quelque sorte, non? Alors est-ce que l'on s'attend à ce que l'implémentation de l'API de données (data-jdo, ou autre chose en fonction de l'expérimentation) soit fournie (appropriée pour dire/injecter?) Par l'invocateur?

Oui. Dans le monde .Net, j'utilise une Factory (comme dans une instance du Factory Pattern) qui renvoie dynamiquement l'implémentation du fournisseur de données (dont l'une de celles à utiliser est définie par config). Le fournisseur de données est renvoyé par l'usine en tant qu '«objet» et il appartient au code de logique métier appelant de le convertir en un type correct, tel que spécifié par l'interface utilisée par la logique métier.

Je suis egot (un autre!) Article sur Dependency Injection pour .Net qui pourrait aider à expliquer avec certains des problèmes, mais je suis sûr qu'il y en a de bonnes basées sur Java quelque part.

devrais-je utiliser un certain cadre comme printemps pour me permettre de choisir quelle mise en œuvre de mes données-api est utilisé, via XML?

Probablement. Je dirais passer votre temps à maîtriser les concepts en premier, s'inquiéter des «meilleures pratiques» après cela. Pour info, j'ai appris AJAX à la dure - en écrivant tout le code moi-même.Ces jours, je courrais droit à un bon cadre, mais je pense que j'ai la confiance de le faire après avoir vraiment grokked les bases en faisant un peu dur greffe au charbon face :)

. .. Si la réponse est ou devrait être « jamais », alors que ...

Ouais - c'est jamais. Utilisez une usine.

1

Votre data-api est une couche d'interface DAO, c'est tout ce que votre couche business (ou service) doit savoir sur la persistance. Et la couche de présentation ou toute autre couche au-dessus de la couche de gestion ne doit avoir aucune "connaissance" de la couche DAO sous-jacente.

Pour cela, il est recommandé de s'appuyer sur un framework tel que Spring. La couche de niveau supérieur charge un contexte d'application qui contient toutes les informations nécessaires à l'infrastructure pour charger l'implémentation appropriée. Par exemple, vous pouvez charger applicationContext.xml depuis le frontal pour utiliser data-jdo, et charger testApplicationContext.xml depuis les tests unitaires pour utiliser data-jpa.