2013-07-01 8 views
6

Wie gebe ich Zugriff auf Benutzer konfiguriert Einstellungen in DDD?DDD und Konfiguration

Wir haben eine Konfigurationsdatenbank, die Elemente als eine Reihe von Schlüssel-Wert-Paaren speichert. Dies scheint nicht wirklich zum Repository-Muster zu passen. Wie kann ich dem Benutzer den Zugriff auf diese Konfigurationswerte ermöglichen?

Idealerweise würde ich gerne separate Klassen für verschiedene Gruppierungen der Konfiguration haben, dh .. BillingSettings, ReportSettings, TaxSettings.

Es wäre seltsam, ein separates Repository für jede von diesen bereitzustellen, aber ich möchte auch Persistenz Ignoranz für diese Einstellungen Klassen beibehalten.

Wie kann der Zugriff auf die Konfiguration in DDD korrekt aktiviert werden?

Antwort

1

Was ich normalerweise tun, ist nur die Konfiguration mit Schnittstellen abstrahieren, z. IBillingConfiguration, IReportConfiguration usw. Die Implementierungen von diesen sind dann, was in die relevanten Methoden (oder in die relevanten Objekte injiziert) gelangt.

Woher die Werte kommen, sollte dann eigentlich egal sein. Es gibt Zeiten, in denen ich ein Repository verwende, um die Werte in einer Datenbank zu speichern, und dann hätte ich etwas wie IConfigurationPropertyRepository. Es ist etwas peinlich, da sich ein ConfiruationProperty nicht wirklich wie ein erstklassiger Bürger in der Entity Welt fühlt, aber es scheint, dass die Arbeit erledigt wird.

Ich würde einige Implementierung eines IBillingConfiguration, dass nur die erforderliche Eigenschaft aus einer zugrunde liegenden Sammlung oder ConfigurationProperty Objekte zurückgibt.

Die entsprechenden Get und Save Methoden für jede I{Some}Configuration würde auf dem so ConfigurationPropertyRepository umgesetzt werden, dass ich/speichern nur diese Teilmenge der Eigenschaften, die angewendet werden müssen.

0

Ist BillingSettings tatsächlich ein Aggregat (oder sogar ein Domänenobjekt) in Ihren Domänenmodellen? Wenn nicht, sollte es kein entsprechendes Repository haben.

Die meisten Konfigurationen sind infrastrukturspezifisch wie jdbc URL, Passwort und so weiter. Sie müssen nicht mit DDD umgehen. Wir benötigen möglicherweise einen ConfigurationService, der CRUD-Operationen unterstützt, wenn die Einstellungen in der Datenbank gespeichert sind und von Benutzern zur Laufzeit geändert werden dürfen. Der ConfigurationService gehört jedoch nicht zur Domäne und diesem beschränkten Kontext, sondern ist lediglich ein Infrastrukturdienst. Wir müssen es nicht auf DDD-Basis entwickeln.

Update für @Kristof Jozsa Kommentar.

Die Einstellungen werden verwendet, um ein Domänenkonzept zu unterstützen. Das Domänenkonzept ist abstrakt und der Zugriff auf Einstellungen ist eine Implementierungsdetails.

class ExpirationSpecification { 
    private int days 
    //other settings?   

    public ExpirationSpecification(int days) {...} 

    public boolean isSatisfied(Order order) {...} 
} 

public class ExpirationServiceImpl implements ExpirationService { 
    //private int days;//inject using placeholder in spring 
    private ConfigurationService configService;//if settings are stored in database 

    ExpirationSpecification spec() { 
     //return new ExpirationSpecification(days); 
     return new ExpirationSpecification(configService.orderExpirationDays()); 
    } 

    void cancel(Order order) {...} 
} 
+1

Das Problem ist, dass es viele geschäftsspezifische Konfigurationswerte gibt - um Ihnen ein Beispiel zu geben, wie ein Geschäftsbegriff "Ablauf" und ein vom System konfigurierbarer Wert für dieses z. in Tagen? Ablaufprüfungen sollten Teil der Domäne sein, aber dafür müssen Sie auch den Konfigurationswert dort eingeben. –

+0

Ich stimme zu :). Und ich ziehe es vor, es als Domänenkonzept zu behandeln. In Ihrem Beispiel würde ich eine OrderExpirationSpecification haben, die von einem Domain-Service zurückgegeben werden könnte. In diesem begrenzten Kontext ist es eine Abstraktion. Wie man die Tage bekommt, ist ein Infrastrukturproblem. Außerdem kann es erforderlich sein, dass der Administrator die Tage zur Laufzeit ändern darf, aber ich denke, die CRUD-Operation sollte in einen anderen beschränkten Kontext aufgeteilt werden. – Hippoom

+0

okay .. ich sehe hier nur ein Implementierungsproblem mit zB. Frühling oder die JEE-Plattform .. irgendwelche Hinweise, wie Sie das angehen würden? –