[JAVA] Abhängigkeitsmanagement in geschichteter Architektur

Was ist diese Seite?

Diese Seite organisiert die im neuen Projekt eingeführten Methoden zur Verwaltung der Geschäftslogik. Wie strukturiere und verwende ich verwandte Klassen in der Situation, dass "Sie keinen großen DI-Container für eine Web-API wie Spring benötigen"? Ist der Fokuspunkt.

Annahme

Dieses Projekt war eine einfache allgemeine Bibliothek, die Ergebnisse zurückgab, wenn ein Argument an eine einzelne Methode übergeben wurde, die zum Einstiegspunkt wurde. Ab dem Einstiegspunkt wird die Geschäftslogik definiert, die mehreren Entitäten zugeordnet ist (eine sogenannte MVC-ähnliche Architektur).

Wenn Änderungen an der Geschäftslogik vorgenommen werden, haben wir diesmal davon ausgegangen, dass sich die Anzahl der Services mit Geschäftslogik anstelle des Einstiegspunkts erhöht oder ändert.

Es ist für den Anrufer etwas unangenehm, eine Instanz des Dienstes direkt zu erstellen und auszuführen

Die Service-Layer-Klasse, auf die vom Einstiegspunkt aus verwiesen wird, ist höchstens 4 oder 5, sodass Sie eine Instanz direkt erstellen können ...

  1. Ob es notwendig ist, eine Instanz aus der Klasse zu erstellen. Wird es generiert, obwohl es keinen Status hat? Ich denke sogar, dass es in Ordnung ist, es in den ultimativen statischen Kontext zu bringen.
  2. Die Notwendigkeit einer Schnittstelle. Muss es nur implementiert werden? Auf der anderen Seite ist es sicher, eine IF als Versprechen zu machen.
  3. Es gibt ungefähr drei Möglichkeiten, den Anrufer anzurufen. Instanzgenerierung, DI, statische Methode (Nutzung). Und so weiter musste ich mich der Methode des Abhängigkeitsmanagements stellen.

Angst, übernommenes Risiko, Perspektive

Ich habe es aus vier Perspektiven betrachtet:

  1. Es wird durcheinander gebracht, wenn die Geschäftslogik in der zukünftigen Entwicklung zusätzlicher Funktionen aktualisiert wird.
  2. Verlassen Sie sich auf Fettbibliotheken für DI-Behälter.
  3. Ich möchte mich nicht darum kümmern, die Spring / DI-Bibliothek zu installieren ... Es gibt höchstens 5 Dienste. Es tritt eine enge Kopplung auf.
  4. Kann es einfach gelesen werden, wenn andere es lesen? In der Vergangenheit habe ich darüber nachgedacht, dass ich die Klasse nicht konfiguriert und komplizierte Funktionen entwickelt habe, die ich nicht sehen konnte. Deshalb habe ich sorgfältig ausgewählt.

Lösung

Ich beschloss, einen einfachen DI-Behälter vorzubereiten. Es ist ein Bild von einer Klasse mit einer solchen Struktur zwischen Factory-Methode, Singleton und Service Locator. Die Factory-Klasse selbst sollte eine einzelne Instanz sein, und Dienste sollten von dieser einzelnen Instanz abgerufen werden.

Stellen Sie außerdem sicher, dass Aktualisierungen der Geschäftslogik nur ab Werk betroffen sind. Als Geschäftslogik hinzugefügt wurde, fragte ich mich, ob es möglich wäre, der Fabrik eine Instanziierungsmethode hinzuzufügen.

Dann generiert die vom Dienst abhängige obere Schichtklasse den Dienst ab Werk und verwendet ihn. Annotationsbasiertes DI wie dieses in Spring und Java EE scheint in diesem Projekt etwas übertrieben zu sein, daher habe ich es in diesem Projekt nicht verwendet. Als Ergebnis verschiedener Untersuchungen habe ich ein Muster namens DYDI (Do it Yourself Dependency Injection) übernommen, das für mich einfach vorzubereiten ist und für ein kompaktes Projekt wie dieses geeignet zu sein scheint.

Implementierungsimage

Es besteht aus drei Klassen: einer Klasse, die Logik generiert, einer Schnittstelle / Implementierung von Logik und einem Aufrufer.

Bereiten Sie zunächst eine Factory-Klasse vor, die eine Instanz mit Logik zurückgibt.

ServiceFactory.java


public class ServiceFactory {

    /**
     *Fabrikspezifische Einzelinstanz.
     */
    private static final ServiceFactory serviceFactory = new ServiceFactory();

    private ServiceFactory() {}

    public static ServiceFactory getInstance() { return serviceFactory; }

    /**
     *Gibt die eigentliche Logik zurück.
     */
    public TargetLogic getTargetLogic() {
        return new TargetLogicImpl();
    }

Definieren Sie die von dieser Factory zurückgegebene Schnittstelle und Logik. Dies ist eine schnelle Möglichkeit, es je nach Anwendungsfall flexibel zu definieren.

TargetLogic.java


public interface TargetLogic {

    void consume();

}

TargetLogicImpl.java


public interface TargetLogicImpl implements TargetLogic {

    void consume() { 
        //Etwas zu verarbeiten
    }

}

Schließlich werden wir die Logik nennen.

Application.java


public class Application {
    private final TargetLogic targetLogic = ServiceFactory.getInstance().getTargetLogic();
}

Sie können die Logik jetzt ab Werk in der Klasse Application abrufen.

Wie war es?

Wie ich am Anfang gelesen habe, war die Anwendung klein und die Struktur des Projekts einfach, sodass die Methode des Abhängigkeitsmanagements genau richtig war. Selbst wenn es in Zukunft eine logische Änderung gibt, scheint es, dass sie einfach organisiert werden kann, weil es ausreicht, der Fabrik eine Methode hinzuzufügen. Wann sollten Sie eine Instanz erstellen? Sollte es nicht gemacht werden? Es war ein Nebeneffekt, der mein Nachdenken vertiefte.

Wenn Ihr Projekt jedoch etwas größer ist oder mehr Ebenen hat, ist es einfacher, sich auf Bibliotheken wie Spring und Guice zu verlassen. Um ehrlich zu sein, gibt es möglicherweise mehr Projekte, die schwer zu funktionieren sind.

Referenz

Recommended Posts

Abhängigkeitsmanagement in geschichteter Architektur
Hinweise zur Verwendung des Abhängigkeitsmanagement-Plugins
Abhängigkeitsmanagement in Gradle mithilfe des Maven-Repositorys unter Amazon S3