2009-08-27 3 views
5

Ich habe eine neue Anwendung mit meinem aktuellen Verständnis von domain-driven Design erstellt. Bisher habe ich eine Reihe von Klassen, die die Entitäten in meiner Domäne repräsentieren, und ein Repository, um von der Datenbank abzurufen oder in der Datenbank zu bleiben.Domain Driven Design: Abrufen von Listen mit komplexen Daten

Das Problem, auf das ich gestoßen bin, ist, dass ich in der Benutzeroberfläche einige Listen anzeigen muss, in denen die Elemente in der Liste nicht direkt auf Entitäten in meiner Domäne abgebildet werden. Ein Teil der Liste könnte aufgebaut werden, indem einige Entitäten ziemlich tief beansprucht werden, aber andere Daten werden im Wesentlichen zum Zeitpunkt des Abrufs synthetisiert und sind nicht Teil irgendeiner Entität. Lassen Sie mich ein Beispiel geben, das das Problem hoffentlich klarer erklären wird.

In meiner Domäne habe ich Auswertungen (eine Reihe von Fragen zu beantworten) und Antworten (die Antworten, die jeder Benutzer zur Bewertung zur Verfügung gestellt) zu diesen Bewertungen. Ich habe auch Aktionen. Jede Aktion stellt eine Aktion dar, die mit einer Antwort (Senden, Genehmigen, Ablehnen usw.) ausgeführt wurde. Ich habe auch Benutzer.

Eine der Listen von Daten, die ich anzeigen möchte, würde Antworten und Auswertungen enthalten (die nicht beantwortet wurden), dann würde jede Zeile Informationen über den Benutzer enthalten, der gerade mit der Antwort arbeitet (dies wird bei Abrufzeit durch Betrachten der Aktionen, die bei einer Antwort ausgeführt wurden). Jede Werbebuchung enthält auch keine oder mehrere untergeordnete Elemente, bei denen es sich um Aktionen handelt, die bisher für die Antwort ausgeführt wurden.

Das Problem ist, dass ich im Moment keine Möglichkeit habe, den gesamten Datensatz mit meinen Domain-Entities darzustellen. Meine erste Reaktion wäre, einfach eine Datentabelle aus der Datenbank abzurufen und meine Domain-Entitäten zu umgehen. Aber ich sehe viel Wert darin, mit Domänenobjekten zu arbeiten und die Beziehungen zwischen verschiedenen Entitäten in den Objekten selbst zu verankern. Meine nächste Idee wäre also, meine Domain-Entitäten so zu modifizieren, dass sie diese Listen unterstützen, aber ich bin besorgt, dass ich meinen Entitäten seltsame Eigenschaften hinzufügen würde, nur um diese Auflistungsszenarien zu unterstützen und die Leistung zu beeinträchtigen, indem ich im Grunde eine Menge davon mache Objekte, wenn ich diese Daten nur an wenigen Stellen in meinen Apps benötige.

Antwort

2

Ich würde vorschlagen, das nicht als etwas betrachten müssen Sie in Ihre Entitäten Schuhanzieher, sondern einen Service (in dem Domain-Driven Design parlance) schaffen, deren Aufgabe es ist, diese Daten zu sammeln, wenn angefordert und es präsentiert als Aussicht. Dies befreit Sie davon, Ihre Entitäten auf klobige Weise zu überarbeiten.

Das Problem ist, dass im Moment habe ich keine Möglichkeit, diesen gesamten Datensatz mit meinen Domain-Entities darzustellen.

Die unangenehme Reibung, die Sie hier fühlen, ist eine gute Sache. Es ist ein Hinweis darauf, dass die Dinge nicht zusammen passen.

+0

Ok, ich lese jetzt auf Services nach. Wenn Sie sagen, dass der Dienst die Daten als Ansicht darstellt, wie lautet die Ansicht? Ist es eine Klasse, die nur für diesen Zweck definiert ist? Besteht es aus Domain-Entitäten? –

+1

Ich benutze Ansicht im MVC Sinn - das ist etwas, dessen Aufgabe es ist, Ihnen Dinge zu zeigen. Die tatsächlich relevanten Daten werden vom Dienst aggregiert, der dann zur Ansicht weitergeleitet und zur Anzeige gebracht wird (in Ihrem Fall ist dies die von Ihnen genannte "Liste der Daten").Ein Dienst kann sich gut dafür entscheiden, Dinge in separate Klassen zu verpacken (insbesondere wenn viele Ansichten die gleichen Daten verwenden), bevor er sie an Ansichten abgibt, aber das ist keineswegs erforderlich. –

2

Klingt wie Sie haben, (durch das Auftreten dieser Schwierigkeit) ein Problem mit Ihrem Domänenmodell identifiziert. Die Abstraktion, die Sie in jedem dieser Listenfelder anzeigen möchten, ist in Ihrem Domänenmodell und in Ihrer "allgegenwärtigen Sprache" anscheinend nicht gut dargestellt. Entscheiden Sie, was es ist, benennen Sie es und fügen Sie Code zu Ihrem Repository hinzu, um Listen dieser Objekte zu generieren, egal ob es sich um Entitäten oder um Wertobjekte handelt ...

+1

In der Tat - ich mag das vorliegende Problem falsch verstehen, aber mein erster Eindruck ist, dass die Domain-Entitäten nur zusätzliche Eigenschaften benötigen: dh Response-Entitäten sollten eine Actions (oder ActionHistory) -Eigenschaft haben, um "Aktionen, die für die Antwort ausgeführt wurden bisher." –

+0

Klingt, als ob Sie das Problem verstehen, das ich habe. Ich erwäge, diese zusätzlichen Eigenschaften hinzuzufügen, aber ehrlich gesagt gehört ein Teil meiner Sorge damit, möglicherweise viel mehr Daten zu laden, als ich wirklich zu bestimmten Zeiten brauche. Die Aktionen sind ziemlich geradlinig und würden kein Problem darstellen, aber meine Benutzereinheiten sind ziemlich komplex und es scheint eine Menge zusätzlicher Arbeit zu sein, um den gesamten Benutzer zu laden, wenn ich nur die Benutzer-ID und den Namen brauche. Aber das teilweise Laden einer Entität scheint mir wirklich hacky zu sein. –

+1

Wenn es sich um ein Leistungs-/Optimierungsproblem handelt, dann wäre John Feminellas Antwort (um eine Servicemethode zu entwickeln) definitiv angebracht. Abgesehen davon können Sie mit vielen OR/M-Tools diese Eigenschaften lazy-loaden (was natürlich sinnlos ist, wenn Sie keine davon verwenden oder Ihre eigene Datenzugriffsschicht/das eigene Repository rollen). –