Frage

In Domain Driven Design, scheint es eine gute Übung, um Fabriken zu benutzen, um Ihre Domain-Objekte in Ihrer Domain Ebene zu erstellen (im Gegensatz eines direkten Konstruktor oder IoC zu verwenden).

Aber was ist die Domain-Objekt Fabriken in Präsentator Schicht verwendet. Zum Beispiel, sagen, dass ich ein Domänenobjekt aus Benutzereingaben von dem Präsentator erhalten wurde entsteht.

Hier ist ein Beispiel, sagen, dass ich eine Konfiguration Domain-Objekt haben, die eine Anzahl von Dezimaleinstellungen hat.

public class Konfiguration: PersistantObject {

 public decimal temperature {get;set;}

 ...(times 20)

 public decimal gravity {get;set;}

}

Um diese Aufgabe in der Domäne Ebene zu erstellen, anstatt die Präsentator Schicht, würde ich jede dieser Dezimalzahlen als Funktionsparameter übergeben. Erstellen eine unhandliche Funktionsdefinition und Anruf.

dh ConfigurationService.CreateConfiguration (Temperatur, ... (x20), Schwerkraft);

Die vielleicht bessere Lösung wäre es, das Konfigurationsobjekt in der Präsentator Schicht zu erzeugen, und alle Werte des Konfigurationsobjekts zuweisen direkt von der Benutzereingabe, einen langen Funktionsaufruf zu überspringen.

Konfiguration config = ConfigurationFactory.CreateNewConfiguration ();

config.temperature = Temperatur;

.. (x20) .. = ...;

config.gravity = Schwerkraft;

ConfigurationService.SaveNewConfiguration (config);

Aber ich frage mich, ob dieser Ansatz falsch ist und warum? Wenn diese beiden Ansätze sind falsch, was ist der beste Ansatz für ein langes Objekt aus Benutzereingaben erstellen und warum?

Danke!

War es hilfreich?

Lösung

Ich würde davon abraten, Ihre Domain-Objekte aus der Domänenschicht und in die Präsentationsschicht im Stich gelassen. Halten Sie die Präsentationsschicht auf Präsentation fokussiert.

Aus diesem Grunde I Datenübertragung Objekte konstruieren Daten mischen zu und von der Domain-und Präsentationsschichten. In Ihrem Fall haben der Dialog ein DTO füllen, die zu Ihren Diensten und übersetzt in die entsprechenden Domain-Objekt übergeben wird.

Sie möchte nicht Domänenobjekte aus DTOs jedes Mal konstruieren, though. Betrachten der Fall, in dem ein DTO nur eine Teilmenge eines Domänenobjekt darstellt. Rekonstruieren eines bestehenden Domain-Objekt aus einem solchen DTO würde Ihnen eine partielle Domain-Objekt. Sie würden vermutlich einen leichten Cache beibehalten werden sollen, die das gesamte Domain-Objekt gehalten, so dass Sie eine richtige Update tun könnten.

Im Wesentlichen werden Sie an der DTO Lösung kommen, wenn Sie das Parameter Objekt einführen Refactoring.

Andere Tipps

Es gibt zwei Möglichkeiten, ich würde damit umgehen

1) Wenn diese Einstellung durch einen Dialog werde ich Klassen erstellen, die Befehlsmuster Implementierung und einen Dialog mit dem betreffenden Objekt binden. Zum Beispiel CmdCreateConfigurationService und CmdEditConfigurationService.

CmdCreateConfigurationService würde auf einer Factory-Klasse verlassen und minimalen Parameter Sie müssen den richtigen Konfigurationsdienst wählen.

Sie Setup eine IConfigurationServiceEditor Schnittstelle und passieren, dass als einer der Parameter auf CmdEditConfiguration Parameter. Mit der IConfigurationServiceEditor Schnittstelle definieren Sie beliebig viele Methoden, wie Sie die Übertragung von Informationen von und zum Dialog einfach und schmerzlos wie möglich zu machen brauchen. Ich empfehle, mit einer Sammlung von Schlüsseln und Werte.Verfahren Befehlsobjekt weiß, wie hoch der Konfigurationsdienst aus dieser Sammlung zu gründen. Der Dialog kennt diese Sammlung zu erwarten, wenn die Einrichtung.

Unabhängig von der Datenstruktur werden Sie die Arbeit tun, um den Konfigurationsdienst im Befehlsobjekt ausfüllen. Indem nicht Dialog / Form / Bildobjekt IConfigurationServiceEditor implementieren Sie Ihre Tests und unter bestimmten Umständen machen Konfiguration von komplexen Objekten easiers automatisieren können.

Ich entwickelte diese Methode für eine CAD / CAM softaware, die mehrere Dutzend parametrischer Formen mit jeweils 4 bis 40 Einträge hat.

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