2017-12-12 8 views
0

Ich baue eine Anwendung mit DDD-Prinzipien. Ich denke jetzt über die Namensraumstruktur im Kern meiner Anwendung nach. Bitte beachten Sie die Idee unter:Sollte ich Namespaces für Entitäten und Wertobjekte erstellen?

Company.Application.Core.Entities 
Company.Application.Core.ValueObjects 

Allerdings habe ich nicht ein einziges Beispiel für eine Anwendung auf GitHb finden, die diese Konvention folgt. Gibt es einen bestimmten Grund, dieser Namenskonvention nicht zu folgen?

Ich habe auch eine Basisklasse für Einheiten, dh Company.Application.Core.Entities.Entity und eine Basisklasse für Wertobjekte, dh Company.Application.Core.ValueObjects.ValueObject

Die Alternative ist in allen Wert Objekte und Entitäten zu setzen: Company.Application.Core

Antwort

0

Ihr Ansatz funktioniert, aber solche Kompositionen erzählen Geschichte über Ihren Code, der sich auf DDD-Bausteine ​​konzentriert, und nicht über immanente Funktionen Ihrer Domain. In DDD wollen wir wichtige Dinge über Domain zeigen, die Technologieprobleme sind nicht mehr die wichtigsten Anliegen.

Ich schlage vor, Erstellung folgende Namespaces:

YourCompany.YourApplicationName.YourParticularBoundedContextName.Application 

hier Sie alle Anwendungsbereiche Bausteine ​​d Application Services und DTO halten können, die verwendet werden Parameter Application Services zu übertragen und das Rück Daten von ihnen.

YourCompany.YourApplicationName.YourParticularBoundedContextName.Domain 

Dies ist der Namespace, in dem Sie Unternamespaces für Domain Scope-Bausteine ​​erstellen.

YourCompany.YourApplicationName.YourParticularBoundedContextName.Domain.AggregateName 

jedes Aggregat haben einen eigenen Namensraum, in dem Aggregate Root-Klasse gibt es, Organisationen und VOs intern verwendete in diesen Aggregaten, Repository-Schnittstelle, Aggregate Fabrik bei Bedarf usw. ich weiß nicht, ob in C# ist möglich, aber in Java gibt es einen weiteren Vorteil des separaten Pakets (Namespace) für Aggregat - Sie können die Aggregat-Root-Klasse und alle anderen Entitäten und VOs, die intern als Paketbereich verwendet werden, nicht außerhalb des Pakets (Namespace) sichtbar machen). Auf diese Weise bauen Sie öffentliche API für Ihre Aggregate, dass niemand brechen kann, weil es ein Wächter ist: die Compiler :)

YourCompany.YourApplicationName.YourParticularBoundedContextName.Infrastructure 

hier ist ein Ort für Endlager Implementierungen (jeweils in subnamespace entsprechenden Aggregaten)

YourCompany.YourApplicationName.Domain 

und auch gehalten in separatem Projekt, wie Sie es in einer anderen Anwendung wiederverwenden können versuchen:

Basisklassen können in gehalten werden.

Was ist der Vorteil? Bei der Arbeit mit Code konzentrieren Sie sich eher auf Features und Domänen als auf technologische Aspekte. Sie werden häufiger mit Problemen wie "Wie sieht dieser Prozessfluss aus?" Umgehen als "Ich möchte alle meine Entitäten und VOs gleichzeitig sehen". Lassen Sie Ihre Code-Struktur dies unterstützen.Trennen von Entitäten (Aggregate Teile tatsächlich) und VOs (auch Aggregate Teile) in separate Namespaces Sie verloren Informationen, was mit was funktioniert. Sie können einfach mit einem großen Schlammball enden, weil Sie etwas wiederverwenden, das nicht wiederverwendet werden sollte.

Bitte schauen Sie sich an: https://github.com/BottegaIT/ddd-leaven-v2 es ist ein Beispielprojekt in Java mit Verpackung auf diese Weise. Vielleicht wird es dir helfen.

Ein anderes Beispiel ist: https://github.com/VaughnVernon/IDDD_Samples das ist ein Beispiel für Vaughn Vernon Buch über DDD.

Es gibt auch Artikel, die nützlich sein können: http://www.codingthearchitecture.com/2015/03/08/package_by_component_and_architecturally_aligned_testing.html

0

Verwendung separater Namensraum für Ihre Entitätstypen (die zu Datenbanktabellen usw. zugeordnet sind) und Ihre DTO-Typen (die für die Weitergabe von Daten zwischen Client- und Serverebene Ihrer Anwendung verwendet werden) sind gängige Praxis, auch wenn und .ValueObjects keine besonders häufige Wahl sind. Ich denke nicht, dass es sich lohnt, sich so viele Gedanken zu machen, wie Sie sie konsistent verwenden.

+0

ich über die Domänenschicht spreche. Der Domänenebene ist die Datenbank nicht einmal bekannt. Deshalb verstehe ich nicht, was du meinst. – w0051977

Verwandte Themen