2012-08-31 14 views
6

ich ein Treffen bezwecken:Wann Audit-Felder aktualisieren? DDD

Meeting{id, name, time, CreatedBy, UpdatedBy}

und ein

MeetingAssignee{id, MeetingID, EmployeeId, CreatedBy, UpdatedBy)

Meeting, als Aggregat Wurzel wird ein Verfahren AssignEmployee.

Ich war im Begriff, den aktuellen Benutzer an das Meeting-Objekt übergeben, wie ich AssignEmployee aufrufen, so dass es seine Prüffelder entsprechend aktualisieren kann.

Aber das scheint nicht richtig - oder? Natürlich kann ich die Audit-Felder veröffentlichen und später ändern - vielleicht auf Serviceebene?

Was ist die andere bevorzugte Methode zum Aktualisieren dieser Felder?

Bitte beachten Sie: Wir verwenden nicht Nhibernate, sondern ein benutzerdefiniertes ORM, das nicht automatisch installiert ist.

Danke.

Antwort

4

Auditing und Protokollierung sind Spaß, wie sie in der Regel überall in der Anwendung benötigt werden, und sie sind beide Anforderungen (Protokollierung ist eine Anforderung von den OPs Jungs).

Ohne viel Ihres Modells zu kennen, und da Auditierung eine Voraussetzung sein muss, würde ich den aktuellen Benutzer AssignEmployee passieren und stattdessen eine Linie dort zu haben, das sagt AuditBlahBlahBlah ich ein Ereignis (vielleicht MeetingUpdated oder AssigneeAdded hinzufügen würde .. Sie werden einen guten Namen finden) und dieses Ereignis wird an die Klasse gesendet, die das Auditing durchführt. Auf diese Weise hat die Meeting-Klasse keine Ahnung vom Auditing und versendet Business-Ereignisse für Auditing-Zwecke (was meiner Meinung nach sehr DDDish ist).

Ich frage mich, was andere Leute sagen vielleicht (hoffentlich, ich etwas Neues lernen kann!)

+0

Ich habe mich gefragt, ob ich in letzter Zeit die Event-Aggregator- oder Event-Sourcing-Patterns verwenden könnte. –

+0

Ich liebe Ereignisse, sie sind so OO und gehen Hand in Hand mit dem Konzept der Nachrichtensendung, anstatt "Methode Aufruf" (die sogar prozedural klingt). By the way, ich bin Java-Entwickler und wir haben nicht den Luxus, Ereignisse wie in .net :(, genießen sie! Ich würde hinzufügen: tun, wenn nicht alle Ihre Protokollierung und Prüfung mit Ereignissen - das Buch wächst Objektorientierte Systeme, die von Tests geleitet werden, haben dafür ein sehr gutes Beispiel. " – Augusto

+0

Danke, ich werde das Buch überprüfen, die gesamte Protokollierung und das Auditing mithilfe von Ereignissen war etwas, was ich bis vor kurzem nicht wirklich in Betracht gezogen hatte. Ich muss es tun einige lesen zu diesem Thema. –

0

Sie könnten möglicherweise den Anruf an den Audit-Service von der Service-Schicht, wenn persistierenden oder die Entitäten zu aktualisieren, mit dem Auditdienst Sie müssen in alle Dienste eingefügt werden, für die eine Überwachungsfunktionalität erforderlich ist, und die neu erstellten Entitäten so schnell wie möglich beibehalten.

Ich sehe, wie es schwierig sein könnte herauszufinden, wie und wann zu auditieren, vor allem, wenn Ihre Entitäten als nutzbare Entitäten in dem System vorhanden sein werden, bevor sie beibehalten werden. Selbst wenn sie für eine gewisse Zeit bestehen, bevor sie beibehalten werden, könnten Sie möglicherweise speicherinterne Überwachungsdaten erstellen, die die Details ihrer Erstellung enthalten, und dann beibehalten, wenn die Entitäten schließlich bestehen bleiben. Oder lassen Sie die Daten "created-by", "created-on", "modified-by", "modified-on" usw. als private Felder in der Entität definieren und sie in ein Überwachungsprotokoll schreiben, wenn die Entität beibehalten wird?

Ich wäre daran interessiert, was die Kompromisse wäre.

4

Verwenden Sie Domänenereignisse.

Alles, was in Ihrem Domain-Modell interessant ist, sollte ein Ereignis auslösen, laut schreien, was gerade passiert ist. Von außen hängen Sie einfach den Log-Handler an, der sie in db oder anderswo ablegt.

Auf diese Weise müssen Sie Ihre Domäne nicht mit einer Art von IAuditService verderben.

Noch besser - Domain-Modell kann Eventing als eine Möglichkeit verwenden, in sich selbst zu kommunizieren.
Um zu zeigen, warum das eine gute Idee ist - visualisieren Sie, dass wir das Domänenmodell von Morgen, Sonnenaufgang und Blumen beschreiben.

Ist es die Verantwortung der Sonne zu sagen, alle Blumen, die sie öffnen sollten? Nicht wirklich. Die Sonne muss nur hell genug leuchten (um ein Ereignis auszulösen), das Licht muss zur Erde wandern (es muss eine Art Infrastruktur geben, die Vielseitigkeit möglich macht) und Blumen müssen selbst reagieren, wenn sie Licht empfangen (andere Domänenmodelle sollten mit Ereignissen umgehen).

Eine weitere Analogie - es ist die Verantwortung des Fahrers zu sehen, was die Farbe der Ampeln ist.