Ich versuche, Dinge zu halten, sehr einfach, wann immer ich kann, so in der Regel so etwas wie dies funktioniert für mich:
Myapp.Domain - Alle domänenspezifische Klassen teilen diesen Namespace
Myapp.Data - dünne Schicht, die abstrahiert die Datenbank von der Domäne.
Myapp.Application - All "Support-Code", Protokollierung, gemeinsamer Dienstprogramm Code, Service Verbraucher usw.
Myapp.Web - Der Web-UI
So werden Klassen können zum Beispiel sein:
- Myapp.Domain.Sales.Order
- Myapp.Domain.Sales.Customer
- Myapp.Domain.Pricelist
- Myapp.Data.OrderManager
- Myapp.Data.CustomerManager
- Myapp.Application.Utils
- Myapp.Application.CacheTools
Etc.
Die Idee, die ich versuche, im Auge zu behalten, wie ich entlang gehen, ist, dass die „Domäne“ Namespace ist das, was die eigentliche Logik der Anwendung erfaßt. Also, was geht dort ist, was Sie mit den "Domain-Experten" (Die Jungs, die die Anwendung verwenden wird) darüber sprechen. Wenn ich etwas schreibe, weil es etwas erwähnt hat, sollte es im Domain-Namespace sein, und wenn ich etwas schreibe, das sie nicht erwähnt haben (wie Logging, Tracing-Fehler usw.), sollte es NICHT im Domain-Namespace sein.
Aus diesem Grund bin ich auch vorsichtig, zu komplizierte Objekthierarchien zu machen. Im Idealfall sollte eine etwas vereinfachte Zeichnung des Domänenmodells für Nicht-Programmierer intuitiv verständlich sein.
Zu diesem Zweck fange ich normalerweise nicht an, indem ich über Muster im Detail nachdenke. Ich versuche, die Domäne so einfach wie möglich zu modellieren, indem ich nur den objektorientierten Designrichtlinien folge. Was muss ein Objekt sein? Wie hängen sie zusammen?
DDD beschäftigt sich mit der Handhabung komplexer Software, aber wenn Ihre Software selbst nicht sehr komplex ist, könnten Sie leicht in eine Situation geraten, in der DDD Komplexität hinzufügt, anstatt sie zu entfernen.
Sobald Sie haben ein gewisses Maß an Komplexität in Ihrem Modell beginnen Sie zu sehen, wie bestimmte Dinge sollen, organisiert werden und dann werden Sie wissen, welche Muster zu bedienen, welche Klassen Aggregate usw.
In meinem Beispiel , Myapp.Domain.Sales.Order wäre ein aggregierter Root in dem Sinne, dass wenn er instanziiert ist, er wahrscheinlich andere Objekte enthält, wie beispielsweise ein Kundenobjekt und eine Sammlung von Auftragspositionen, und Sie nur auf die Auftragspositionen für diesen bestimmten Bereich zugreifen würden Bestellung über das Bestellobjekt.
Um die Dinge jedoch einfach zu halten, würde ich kein "Master" -Objekt haben, das nur alles andere enthält und keinen anderen Zweck hat, so dass die Befehlsklasse selbst Werte und Eigenschaften hat, die in der Anwendung nützlich sind.
Also werde ich Referenz Dinge wie:
Myapp.Domain.Sales.Order.TotalCost
Myapp.Domain.Sales.Order.OrderDate
Myapp.Domain.Sales.Order.Customer .PreferredInvoiceMethod
Myapp.Domain.Sales.Order.Customer.Address.Zip
usw.
Das macht Sinn ... Auftrag und Kunde sind Sie AggRoots richtig? Wenn Sie also auf Ihr Order-Objekt verweisen, müssen Sie es wie folgt tun: Myapp.Domain.Sales.Order.Order ?? –
Ja und nein - ich habe mein Beispiel etwas erweitert, da der Kommentarbereich etwas zu kurz ist. – Console
'Manager' Klassen in' Data' Namespace machen mich zum anämischen Modell –