Was ist ein praktischer Weg, Lookup-Tabellen in Domain Driven Design (DDD) zu modellieren?

StackOverflow https://stackoverflow.com/questions/808481

  •  03-07-2019
  •  | 
  •  

Frage

Ich bin nur DDD Lernen (Buch Eric Evans ist vor mir offen), und ich habe ein Problem entdeckt, dass ich keine Antwort finden kann. Was tun Sie in DDD tun, wenn Sie nur eine einfache Liste von Lookup-Datensätze zu erhalten versuchen?

Bsp.

EmployeeID: 123
EmployeeName: John Doe
Staat: Alaska (drop-down)
Landkreis:. Wasilla (Drop-down - wird auf der Grundlage Zustand gefiltert werden)

Zum Beispiel, sagen wir mal, dass Sie einen Mitarbeiter Domain-Objekt haben, eine IEmployeeRepository Schnittstelle und eine EmployeeRepository Klasse. Dies wird durch eine UI verwendet werden, um eine Liste der Mitarbeiter und einzelne Details zu zeigen. In der Benutzeroberfläche, möchten Sie, wo die Mitarbeiter lebt ein Drop-Down für den Staat und Landkreis verwenden. Die zur Verfügung stehenden Landkreise werden auf der Grundlage gefiltert werden, welcher Staat gewählt wurde.

die Datenbanktabellen und die UI leider ganz anders aussehen. In tblPersonal, es enthält Staat-Code = AK und Grafschaft-Code = 02130, nicht der Staat und Landkreis Namen.

Der alte Weg (bevor ich diese DDD Suche begann) würde ziemlich einfach sein, nur 2 Abfragen erstellen und einen Datareader verwenden, um den Drop-downs zu füllen. Unter dem Display in den Drop-downs ist der Wert, der in Form Beiträge automatisch verwendet wird.

Mit DDD, aber ich bin nicht sicher, wie Sie sollen, dies zu tun. Ich zum ersten Mal durch die Schaffung von Staat und Landkreis Objekte sowie Repositories und Schnittstellen für den Repositories gestartet. Allerdings schreiben 4 Klassen + 2-Schnittstellen und die sanitären Anlagen in den hbm.xml Dateien + Mitarbeiter Business-Objekte scheint, wie viel des Guten für nur 2 Abfragen für 2 Drop-downs. Es muss einen besseren Weg geben, es nicht tut? Ich ändere nicht die Datensätze in der Staat oder Landkreis Tabellen jederzeit schnell und auch wenn ich es täte, wäre es nicht durch diese Anwendung sein. So will ich nicht wirklich Business-Objekte für Staat und Landkreis schaffen, wenn ich nicht haben.

Die einfachste Lösung, die ich sehe, ist nur eine Hilfsklasse mit Methoden zu erstellen, die Wörterbücher, wie GetStatesAll (), GetState () und GetCounties () und GetCounty () zurück, aber das fühlt sich einfach falsch aus einer DDD Perspektive.

Bitte helfen. Wie kann ich DDD verwenden, ohne Overengineering nur, ein paar einfachen Lookups?

Endlösung Ich denke, dass ich endlich meine Antwort durch Erfahrung gefunden, die das GetStates () -Methode in seine eigenen Datenzugriffsklasse zu setzen waren, wenn auch nicht eine Repository-Klasse. Da ich nur tun, nur Lesezugriff, warf ich sie in eine Struktur DTO. Da die Datenbank klein war, warf ich sie ganz in eine einzige Klasse, wie Todd unten beschrieben.

Meine Schlussfolgerungen:

  1. Lookup-Tabellen sind nie Wertobjekte, weil Lookup-Tabellen immer eine Identität haben. Wenn sie nicht eine Identität haben, würden Sie Duplikate haben, die nicht viel Sinn machen würde.
  2. Read-only-Lookup-Tabelle kann einen Repository, aber wahrscheinlich eine nicht brauchen. Das Ziel eines Endlagers ist die Komplexität, indem der Zugang zu reduzieren zwingt nur durch das Aggregat. Wenn man durch das Aggregat liefert Ihnen eine Möglichkeit, um sicherzustellen, dass Geschäftsregeln durchgesetzt werden können, wie zum Beispiel nicht-Reifen hinzufügen, wenn Sie kein Auto haben.
  3. Wenn Sie CRUD Wartung auf der Lookup-Tabelle zu ermöglichen, dann macht es Sinn für die Nachschlagtabelle sein eigenes Repository zu haben.
  4. Die Tatsache, dass ich die Codes als structs Speicherung endete nicht, sie „Wertetypen“ machen. Fowler sagt in POEAA, die eine Struktur ein Werttyp ist. Das stimmt, structs sind unveränderlich, weshalb Fowler sagt, dass sie „Wertetypen“ sind, jedoch wurde ich sie anders verwenden. Ich war structs als leichte Art und Weise mit der Umgebung DTOs passieren, dass ich nicht die Absicht, jemals hatte nach ihrer ersten Schöpfung auf zu verändern. In Wahrheit sind die Strukturen, die ich tat verwendet, in der Tat, haben Identitäten, aber da sie schreibgeschützt wurden arbeitete sie als structs.
  5. Ein Muster, das ich verwendet habe, dass ich nicht viel an anderer Stelle zu sehen ist Primärschlüsselfelder unveränderlich zu machen. Sie werden von den Konstruktor gesetzt, aber sie sind schreibgeschützt (nicht privat Accessoren) und cannot geändert werden, sobald das Objekt erstellt wird.
War es hilfreich?

Lösung

Sie möchten in das Konzept der Command Query Separation . Ich würde nicht über getippt Repositories für Nachschlagewerte sorgen, aber ich würde wahrscheinlich immer noch DTO Typklassen über Datensätze verwenden etc ...

Sie möchten einige Zeit verbringen von dieses bis zur Gegenwart. Er spricht nicht über Lookup-Daten speziell füllt aber er spricht oft über nicht das Lesen / Reporting-Funktionalität der Anwendung durch typisierte Methoden der Handhabung auf einem Repository.

Andere Tipps

DDD Verwendung Ich habe etwas Ähnliches mit dem folgenden:

interface IAddressService
{
  IList<Country> GetCountries ();
  IList<State> GetStatesByCountry (string country);
  IList<City> GetCitiesByState (string state);
  // snip
}

Land, Staat und Stadt sind Wertobjekte, die aus einer Lookup-Tabelle in der Datenbank kommen.

Nun las ich einen Artikel von Mathias Verraes vor einiger Zeit darüber reden hier . Er spricht über Wert Trennung Objekte im Modell von Konzepten, die die Benutzeroberfläche dienen.

aus dem Artikel Zitiert die Frage, ob Länder als Entitäten oder Wertobjekt zu modellieren:

  

Es gibt nichts an sich falsch mit der Modellierung Ländern   Entitäten und sie in der Datenbank zu speichern. Aber in den meisten Fällen, dass   overcomplicating Dinge. Die Länder nicht oft ändern. Wenn ein   Ländernamen ändert, ist es in der Tat für alle praktischen Zwecke ein   neues Land. Wenn ein Land nicht ein Tag mehr existiert, kann man nicht   ändern Sie einfach alle Adressen, denn möglicherweise wurde das Land geteilt   in beiden Ländern.

Er schlug vor, einen anderen Ansatz ein neues Konzept namens AvailableCountry vorstellen:

  

Diese verfügbaren Länder können in einer Entität in einer Datenbank, Aufzeichnungen sein   JSON, oder auch nur eine hartcodierte Liste in Ihrem Code. (Das hängt davon ab,   ob das Unternehmen einen einfachen Zugang zu ihnen durch eine UI will.)

<?php

final class Country
{
    private $countryCode;

    public function __construct($countryCode)
    {
        $this->countryCode = $countryCode;
    }

    public function __toString()
    {
        return $this->countryCode;
    }
}

final class AvailableCountry
{
    private $country;
    private $name;

    public function __construct(Country $country, $name)
    {
        $this->country = $country;
        $this->name = $name;
    }

    /** @return Country */
    public function getCountry()
    {
        return $this->country;
    }

    public function getName()
    {
        return $this->name;
    }

}

final class AvailableCountryRepository
{
    /** @return AvailableCountry[] */
    public function findAll()
    {
        return [
            'BE' => new AvailableCountry(new Country('BE'), 'Belgium'),
            'FR' => new AvailableCountry(new Country('FR'), 'France'),
            //...
        ];
    }

    /** @return AvailableCountry */
    public function findByCountry(Country $country)
    {
        return $this->findAll()[(string) $country];
    }
}

So ist es scheint es eine dritte Lösung ist, die Tabellen als beide Wertobjekte und Entitäten nachschlagen zu modellieren ist.

BTW stellen Sie sicher, u die Kommentare prüfen einige ernsthafte Gespräche über den Artikel.

Der Staat und Landkreis sind nicht Entitäten, sondern Wertobjekte. Sie sind nicht Gegenstand Ihres Systems. Die Art und Weise Sie sagten, Sie diese vorher behandelt ist OK. Wann werden Sie den Staat oder Landkreis Datensätze in der Datenbank, in den Zustand Ihres Domain-Modell auf den Änderungen basiert ändern? Nicht, so werden diese nicht einen Repository benötigen.

Sie lesen das falsche Buch, wenn Sie erfahren möchten, wie DDD zu tun, ohne es zu verkomplizieren über. : -)

Die einfachste Lösung, die Sie vorschlagen, ist in Ordnung, wenn es Ihren Bedürfnissen entspricht. Einkapseln Adressdaten in Business-Objekte können so einfach oder so kompliziert, wie Ihre Anwendungsanforderungen. Zum Beispiel hat der Staat Objekt eine Eins-zu-viele-Beziehung mit Kreis so Mitarbeiter wirklich nur einen Kreis verweisen muss, wenn man es auf diese Weise zu modellieren gewählt haben. Ich würde nur diese Art der Komplexität einführen, falls erforderlich.

Außerdem, ich glaube nicht, dass es viel durch die Definition von Schnittstellen für Ihre Repositories gewonnen werden, es sei denn es eine reale Möglichkeit ist, dass Sie mehrere Repositories für Ihre Objekte haben könnten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top