2016-09-29 2 views
2

Bei einigen meiner Projekte verwende ich den Double Dispatch-Mechanismus, um zur Laufzeit eine "Ansicht" meines Infrastrukturmoduls zu meinem Domänenmodul (Strengthening your domain: The double dispatch pattern) bereitzustellen. Was ich oben 'Module' nenne, sind einfach separate JAR-Dateien, bei denen die Abhängigkeit von service.jar-> domain.jar nur zur Kompilierzeit erzwungen wird. Kann ich dies an Java-9 arbeiten lassen, wenn ich meinen Service und meine Domain als 'echte' Java 9-Module definiere?Java 9 Modul und Doppelversand in 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) 

Antwort

3

Ja, das ist möglich. Hier sind einige Dinge zu beachten:

  1. Das Modul Domain Bedürfnisse export the package enthält Fee. Möglicherweise für alle, aber mindestens to service.
  2. Das Modul Service wird require domain haben als BalanceCalculatorImpl-accessBalanceCalculator hat, da sie es implementiert.
  3. Es sieht aus wie Kunden von Service wissen müssen über Domain als auch, die ein Lehrbuch Fall für implied readability ist.
  4. In einem einfachen Setup entweder Service oder ein drittes Modul muss BalanceCalculatorImpl instanziiert und es Fee passieren, kann dies nicht in Domain passieren oder es würde eine zyklische Abhängigkeit schaffen.
  5. Eine erweiterte Lösung wäre services, wo alle Code, der auf BalanceCalculator zugreifen kann, auch innerhalb Domäne, können alle Implementierungen erhalten.

alle diese Berücksichtigung, das ist, was die beiden module declarations könnte wie folgt aussehen:

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; 
} 

jedes Modul dann die BalanceCalculator verwenden mag, kann es in seiner Modul-Deklaration erklären mit uses com.example.domain.balance.BalanceCalculator und Instanzen erhalten davon mit Java's ServiceLoader.

Sie können mehr praktische Anwendungen des Modulsystems (insbesondere für Dienstleistungen] in a demo I created finden

. (Anmerkung: Die Antwort wurde nach this exchange überarbeitet)

+0

Jede Arbeit um oder Art und Weise eine Art zu definieren. Laufzeit 'schwache' Abhängigkeit? – Franck

+0

Eigentlich ist Ihr Baum falsch.In Domäne, ich habe eine Schnittstelle nennen wir es BalanceCalculator und in meinem Dienst habe ich die Impl davon, nennen Sie es BalanceCalatorImpl.java ..... Bin ich darin blockiert Fall? – Franck

+1

Können Sie Ihre Frage aktualisieren, um diese Informationen aufzunehmen - vorzugsweise in einem Diagramm. :) – Nicolai