User Tools

Site Tools


patterns:inheritancerolestrategyoverview

Vererbung, Rollen und Strategien in CQRS mit Event Sourcing

Der Authentication BC verwendet Vererbung für das Konto1). Ein Konto kann entweder ein System darstellen2) oder eine Person. Dabei kann die Person entweder direkt im Konto über den Namen identifiziert werden, oder sie kann wie in PRO•M einer Person zugeordnet werden3). Es ist theoretisch möglich, dass Konten auch noch andere Dinge darstellen werden, z.B. Personen aus anderen BCs als des Person BC in PRO•M, daher wird gleich die Möglichkeit eingebaut, von Account abzuleiten.

Der Mitarbeiter4) im Employment BC ist eine Rolle einer Person im PersonBC. Das wird nicht über eine PersonID in Employee dargestellt, sondern dadurch, dass die EmployeeID die PersonID ist. Die Person in Person BC wird auch nicht über die Mitarbeiterrolle erweitert5), sondern komplett im Employee BC implementiert. Das ist eine stärkere Trennung als das Rollenmuster, aber in der Konsequenz ist es dem Rollenmuster ähnlich. Die Trennung in einen separaten Kontext vereinfacht die Komplexität des Systems. Will ich mit einer Person interagieren, lade ich die Person und sende Befehle an sie. Will ich mit der Person in der Rolle eines Mitarbeiters interagieren, lade ich den Mitarbeiter6) über die PersonID7). Sobald ich die Rolle im Zugriff haben, kann ich sie direkt ansprechen, d.h. es geht hier lediglich darum, wie ich Zugriff auf die Rolle erhalte, und in diesem Fall ist es über ein eigenes Employee Repository.

Der Account im Authorization BC könnte ebenfalls als Rolle von Account im Authentication BC gesehen werden. Das ist aber nicht der Fall. Die Kontexte existieren neben einander, unabhängig voneinander, und können sich getrennt voneinander weiter entwickeln. Eine Übersetzung in einem Anticorruption Layer wird die Verbindung zwischen den Konten herstellen8). Wenn also ein Konto mit einer ID = XYZ identifiziert9) wurde, dann wird das Konto aus dem Kontext in ein Konto im Autorisierungskontext übersetzt, um die Rechte des Kontos zu prüfen. Auch wenn es nicht in der Überschrift steht, ist das ein gutes Beispiel für das Aufteilen von Aufgaben in unterschiedliche Bounded Contexts, und wie man die BCs einfach und überschaubar hält, sie aber weiterhin zusammen arbeiten lässt indem man ACLs implementiert, die zwischen den Kontexten übersetzen.

Die Authentifizierung wird über das Strategy Pattern implementiert. Anstatt UserAccountUserNameAuthentication von UserAccount abzuleiten, und SystemAccountUserNameAuthentication von SystemAccount, ist es sinnvoller, jedem Konto eine Strategie zur Authentifizierung an die Hand zu geben. Erstens kann dadurch dieselbe Strategie für die unterschiedlichen Kontoarten verwendet werden, zweitens können die Strategien unabhängig von den anderen Bereichen erweitert werden. So kann z.B. eine X.509 Strategie dazu kommen, ohne dass irgend ein anderer Aspekt der Anwendung angepasst werden muss10).

1) Account
2) z.B. einen Dienst, der Rechte haben muss um Schnittstellen bedienen zu können
3) Wobei die Person im Authentication BC lediglich durch ein Value Object, die PersonID, dargestellt wird. Es ist dem Authentication BC egal, was dieses Value Object darstellt. Die eingezeichnete Referenz von UserAccount zu Person ist auch nur gedacht. Es gibt Übersetzer im Anticorruption Layer zwischen den Kontexten um aus einer PersonID im UserAccount eine Person im Person BC zu identifizieren
4) , 6) Employee
5) obwohl das möglich und auch vorbereitet ist - abstrakte Rollen einer Person, die dann z.B. von Employee geerbt werden können
7) Anstatt die Person zu laden und dann über person.GetRole(typeof(Employee) ) die Mitarbeiterrolle zu erhalten
8) in dem einfachsten Fall über ein und dieselbe ID
9) authentifiziert
10) Das alles dient dem Open-Closed concept: Ein System soll offen für Erweiterungen sein, aber geschlossen für Änderungen
patterns/inheritancerolestrategyoverview.txt · Last modified: 2013/01/07 14:34 by rtavassoli