135 lines
4.8 KiB
Plaintext
135 lines
4.8 KiB
Plaintext
@startuml
|
|
title "Bounded Context: ZNS-Import als Anti-Corruption Layer (ACL)"
|
|
|
|
!theme vibrant
|
|
|
|
' Der Bounded Context wird als Paket mit dem Stereotyp <<ACL>> dargestellt
|
|
package "ZNS_Import_ACL" <<ACL>> {
|
|
|
|
' Eine Komponente, die die Übersetzungslogik kapselt
|
|
component ZNS_Daten_Uebersetzer [
|
|
+ importiere_zns_zip()
|
|
+ uebersetze_Personen()
|
|
+ uebersetze_Pferde()
|
|
+ uebersetze_Vereine()
|
|
]
|
|
|
|
' Die folgenden Entitäten repräsentieren die 1:1 Abbildung der Zeilen aus den ZNS .dat-Dateien.
|
|
' Sie sind "anämisch" und enthalten keine Geschäftslogik.
|
|
|
|
package "Rohdaten-Struktur aus ZNS-Dateien" {
|
|
' Basierend auf VEREIN01.DAT
|
|
entity ZNS_VEREIN01_dat_Satz {
|
|
' VEREIN (Nummer), Stelle 1-4 [cite: 177]
|
|
+ verein_nummer : VARCHAR(4)
|
|
' VEREINSNAME, Stelle 5-54 [cite: 177]
|
|
+ vereinsname : VARCHAR(50)
|
|
}
|
|
|
|
' Basierend auf PFERDE01.DAT
|
|
entity ZNS_PFERDE01_dat_Satz {
|
|
' SATZNUMMER DES PFERDES, Stelle 202-211 [cite: 164]
|
|
+ satznummer_des_pferdes : VARCHAR(10)
|
|
' PFERDENAME, Stelle 5-34 [cite: 164]
|
|
+ pferdename : VARCHAR(30)
|
|
' LEBENSNUMMER, Stelle 35-43 [cite: 164]
|
|
+ lebensnummer : VARCHAR(9)
|
|
' GEB.JAHR, Stelle 45-48 [cite: 164]
|
|
+ geb_jahr : VARCHAR(4)
|
|
' ... (weitere Felder gemäß Pflichtenheft S.8)
|
|
}
|
|
|
|
' Basierend auf RICHT01.DAT
|
|
entity ZNS_RICHT01_dat_Satz {
|
|
' ID, Stelle 1 ('X' oder 'Y') [cite: 154, 162]
|
|
+ id_satzart : CHAR(1)
|
|
' SATZNUMMER, Stelle 2-7 [cite: 154, 162]
|
|
+ satznummer : VARCHAR(6)
|
|
' NAME, Stelle 8-82 [cite: 154, 162]
|
|
+ name_komplett : VARCHAR(75)
|
|
' QUALIFIKATIONEN, Stelle 83-112 [cite: 154, 162]
|
|
+ qualifikationen_text : VARCHAR(30)
|
|
}
|
|
|
|
' Basierend auf LIZENZ01.DAT
|
|
entity ZNS_LIZENZ01_dat_Satz {
|
|
' SATZNUMMER DES REITERS, Stelle 1-6
|
|
+ satznummer_des_reiters : VARCHAR(6)
|
|
' FAMILIENNAME, Stelle 7-56
|
|
+ familienname : VARCHAR(50)
|
|
' VORNAME, Stelle 57-81
|
|
+ vorname : VARCHAR(25)
|
|
' VEREINSNAME, Stelle 84-133
|
|
+ vereinsname_text : VARCHAR(50)
|
|
' REITERLIZENZ, Stelle 137-140
|
|
+ reiterlizenz_code : VARCHAR(4)
|
|
' FAHRLIZENZ, Stelle 142-143
|
|
+ fahrlizenz_code : VARCHAR(2)
|
|
' LIZENZINFO, Stelle 201-210
|
|
+ lizenzinfo_text : VARCHAR(10)
|
|
' GEBURTSDATUM, Stelle 182-189
|
|
+ geburtsdatum_text : VARCHAR(8)
|
|
' ... (weitere Felder gemäß Pflichtenheft S.8)
|
|
}
|
|
}
|
|
|
|
' Die Pfeile zeigen den Datenfluss: Der Übersetzer konsumiert die Rohdaten-Sätze.
|
|
ZNS_Daten_Uebersetzer ..> ZNS_VEREIN01_dat_Satz : "liest"
|
|
ZNS_Daten_Uebersetzer ..> ZNS_PFERDE01_dat_Satz : "liest"
|
|
ZNS_Daten_Uebersetzer ..> ZNS_RICHT01_dat_Satz : "liest"
|
|
ZNS_Daten_Uebersetzer ..> ZNS_LIZENZ01_dat_Satz : "liest"
|
|
}
|
|
|
|
' Außerhalb des ACLs liegt unser sauberes, internes Domänenmodell.
|
|
' Der ACL übersetzt die Rohdaten in diese Ziel-Strukturen (oder Events, die diese erzeugen).
|
|
package "Internes Domänenmodell (Ziel)" {
|
|
' Beispielhaft: das Ziel-Objekt im Personen-Context
|
|
class Personenstamm <<Aggregate Root>> {
|
|
+ oepsSatzNrPerson : VARCHAR(6)
|
|
--
|
|
+ name : FamiliennameVO
|
|
+ geburtsdatum : Date
|
|
+ hauptverein : VereinsReferenz
|
|
+ hatLizenz(lizenzTyp) : boolean
|
|
}
|
|
|
|
' Beispielhaft: das Ziel-Objekt im Lizenz-Context
|
|
class Lizenznehmer <<Aggregate Root>> {
|
|
+ oepsSatzNrPerson : VARCHAR(6)
|
|
--
|
|
+ lizenzen : List<Lizenz>
|
|
+ qualifikationen: List<Qualifikation>
|
|
}
|
|
}
|
|
|
|
' Der Übersetzer im ACL erzeugt/aktualisiert die internen Domänenobjekte.
|
|
' Dies geschieht oft über Events oder direkte Service-Aufrufe.
|
|
ZNS_Daten_Uebersetzer ..> Personenstamm : "erzeugt/aktualisiert"
|
|
ZNS_Daten_Uebersetzer ..> Lizenznehmer : "erzeugt/aktualisiert"
|
|
|
|
note right of ZNS_Import_ACL
|
|
**Anti-Corruption Layer (ACL)**
|
|
|
|
Dieser Bounded Context hat eine einzige
|
|
Verantwortlichkeit: Er schützt das
|
|
System vor den Details und der
|
|
Komplexität der externen ZNS-Schnittstelle.
|
|
|
|
1. **Einlesen:** Die `.dat`-Dateien werden 1:1 in die
|
|
`ZNS_*_dat_Satz`-Entitäten eingelesen.
|
|
2. **Übersetzen:** Die Komponente `ZNS_Daten_Uebersetzer`
|
|
transformiert diese Rohdaten. Sie löst
|
|
Codes auf (z.B. Bundesland), normalisiert
|
|
Daten (z.B. kommaseparierte Lizenzen)
|
|
und validiert die Daten.
|
|
3. **Veröffentlichen:** Das Ergebnis der Übersetzung
|
|
wird an die zuständigen internen Bounded
|
|
Contexts weitergegeben, z.B. durch das
|
|
Auslösen von Domänen-Events wie
|
|
`PersonenStammdatenAktualisiert` oder
|
|
`NeueLizenzInformationVerfügbar`.
|
|
end note
|
|
|
|
|
|
@enduml
|