2016-09-29 4 views
2

Sur certains de mes projets, j'utilise le mécanisme de double distribution pour fournir à l'exécution une "vue" de mon module d'infrastructure à mon module de domaine (Strengthening your domain: The double dispatch pattern). Ce que j'appelle 'modules' ci-dessus est simplement des fichiers jar séparés où la dépendance de service.jar-> domain.jar est appliquée au moment de la compilation seulement. Serai-je capable de travailler sur java-9 si je définis mon service et mon domaine comme des 'vrais' modules Java 9?Module Java 9 et double répartition dans DDD

module domain 
    L Fee.java 
     L Payment recordPayment(double, BalanceCalculator) 
    L BalanceCalculator.java 
module service 
    L BalanceCalculatorImpl.java // implements BalanceCalculator 
     L double calculate(Fee fee) //call fee.recordPayment(amount,this) 

Répondre

3

Oui, cela est possible. Voici quelques choses à considérer:

  1. Le module domaine besoins à export the package contenant Fee. Peut-être à tout le monde mais au moins to service.
  2. Le module services devra require domain comme BalanceCalculatorImpl doit accessBalanceCalculator car elle met en œuvre.
  3. Il ressemble à des clients de services besoin de connaître domaine aussi bien, qui est un cas d'école pour implied readability.
  4. Dans une configuration simple, soit le service ou un troisième module devront instancier BalanceCalculatorImpl et le transmettre à Fee, cela ne peut se produire dans domaine ou il créerait une dépendance cyclique.
  5. Une solution plus avancée serait services, où tout le code qui peut accéder BalanceCalculator, même à l'intérieur domaine, peut obtenir toutes ses implémentations.

Compte tenu de tous ces compte, voici ce que les deux module declarations pourrait ressembler à:

module com.example.domain { 
    // likely some requires clauses 

    // export packages containing Fee and BalanceCalculator 
    exports com.example.domain.fee; 
    exports com.example.domain.balance; 
} 

module com.example.service { 
    requires public com.example.domain; 
    // likely some more requires clauses 

    // expose BalanceCalculatorImpl as a service, 
    // which makes it unnecessary to export the containing package 
    provides com.example.domain.balance.BalanceCalculator 
     with com.example.service.balance.BalanceCalculatorImpl; 
} 

Ensuite, chaque module qui aime utiliser BalanceCalculator peut le déclarer dans sa déclaration de module avec uses com.example.domain.balance.BalanceCalculator et obtenir des instances de cela en utilisant Java's ServiceLoader.

Vous pouvez trouver des applications plus pratiques du système de module (en particulier pour les services] dans a demo I created

(Note:. La réponse a été révisée après this exchange)

+0

Les travaux autour ou moyen de définir une sorte de. – Franck

+0

En fait, votre arbre est faux Dans le domaine, j'ai une interface appelons-la BalanceCalculator et dans mon service j'ai l'impl, BalanceCalatorImpl.java ..... Suis-je bloqué dans ce – Franck

+1

Pouvez-vous mettre à jour votre question pour inclure cette information - de préférence dans un diagramme. :) – Nicolai