Filtert im DDD-Repository

8

Es gibt Campaign Entity und dafür CampaignRepository mit diesen Funktionen

  1. public IList FindAll ();
  2. öffentliche Kampagne FindByCampaignNumber (String-Nummer);

Aber jetzt möchte ich diese Kriterien -:

  1. Suchen Sie nach Kampagnen, die heute erstellt werden.
  2. Suchen Sie nach Kampagnen, die in diesem Monat erstellt wurden
  3. Finden Sie die Top 5 der letzten Kampagnen.
  4. Suchen Sie nach Kampagnen, die in diesem Jahr erstellt wurden.

Also für alle diese Kampagnen Filter,

Erstelle ich für jedes Repository separate Funktionen?

und implementieren Sie so.

Getall Kampagnen und filtern Sie dann erforderliche Kampagnen, aber ich möchte nicht alle Kampagnen. Bei der Suche in Google finde ich diese Lösung

1: Ссылка

Gibt es eine Methode, die mehrere Funktionen vermeiden kann, oder mache ich separate Funktionen für jeden dieser Filter?

    
kamal 07.08.2011, 19:53
quelle

4 Antworten

7

Haben Sie erwogen, das Muster Spezifikation in Ihrer Anwendung zu implementieren? Vielleicht sieht es nach einem Overkill aus, aber es kann sich als nützlich erweisen, wenn Ihre App über einige komplexe Benutzerfilteroptionen verfügt.

%Vor%

Hier ist ein Beispiel, wie das Laden aus dem Repository aussehen könnte

%Vor%

Ich möchte auch hinzufügen, dass es sehr darauf ankommt, welche Art von Datenzugriffslösung Sie verwenden, es erleichtert die Implementierung, wenn Sie wissen, welche Art von API Sie verwenden (Criteria API, SQL oder was auch immer) kann Ihre Spezifikationsschnittstelle optimieren, um die Implementierung zu vereinfachen.

UPDATE : Wenn Sie Spezifikationen in .NET mit linq und nHibernate implementieren, lesen Sie Ссылка

    
Boris Treukhov 07.08.2011, 20:55
quelle
3

Ich würde mit der Erstellung von zwei Spezifikationen beginnen: TopCampaignSpec und CampaingCreatedSpec.

%Vor%

CampaingCreatedSpec kann auch durch eine generischere DateRange-Klasse ersetzt werden, wenn Sie diese Funktionalität an anderer Stelle benötigen:

%Vor%

Ich empfehle auch dringend, sich von "generischen" Repositories und Entitäten fernzuhalten. Bitte lesen Sie das

Aus DDD-Sicht spielt es keine Rolle, ob der Datenzugriffscode als SQL / HQL / ICriteria oder sogar als Webservice-Aufruf implementiert ist. Dieser Code gehört zur Repository-Implementierung (Datenzugriffsschicht). Dies ist nur ein Beispiel:

%Vor%     
Dmitry 07.08.2011 21:42
quelle
2

So würde ich das machen:

%Vor%

Die Argumentation ist einfach - es zählt, was Sie interessiert, nach Kampagnen zu suchen (dieses Wissen ist Teil Ihrer Domain). Wenn wir explizit Funktionen angeben, um das zu reflektieren, werden wir es immer wissen.

  

Sollen alle Methoden im Kampagnenrepository hinzugefügt werden?

Ich sehe nichts falsch damit.

  

Arnis Ich möchte etwas Code, wie Sie die Created Today-Funktion in der Domäne selbst implementieren. Wird hier in dieser Funktion ein Repository injiziert? Danke für Ihre Kooperation

Ich würde CreatedToday-Funktion in meiner Domäne nicht implementieren. Es würde im Repository sitzen und Repository-Implementierungen sollten keine Domäne sein. Wenn Sie meinen, wie ich das Campaign-Repository verwenden würde und ob es von der Domain aus verwendet werden soll - nein, sollte es nicht innerhalb der Domain verwendet werden. Wenn Sie meinen, wenn ich Repository in Repository einfügen würde - Sie hören zu viel von xzibit .

    
Arnis Lapsa 08.08.2011 10:23
quelle
-1

Sie sollten alle oben genannten Schritte mit der folgenden Repository-Methode ausführen können:

%Vor%

So mache ich das und es funktioniert sehr gut.

    
Piotr 07.08.2011 22:03
quelle

Tags und Links