Wie bekomme ich den aktuellen Status von der Klasse bbv.Common.StateMachine (jetzt Appccelerate.StateMachine)?

8

bbv.Common.StateMachine class ist der beste State-Machine-Code, den ich je gesehen habe. Aber es fehlt nur eines: den aktuellen Zustand zu bekommen.

Dies ist ein Auftragsverfolgungssystem:

%Vor%

Sie können sehen, wie es funktioniert.

Aber ich möchte den Bestellstatus in der Datenbank speichern. So kann ich zeigen, in welchem ​​Zustand die Bestellung ist.

Ich brauche ein

%Vor%

Methode. Eigentlich gibt es einen Weg: Ich kann ExecuteOnEntry verwenden und einen lokalen Wert für jeden Zustandseintrag ändern. Aber es wird mühsam sein, ExecuteOnEntry für jeden Staat zu schreiben, weil ich mich wiederholen werde!

Es muss einen heiklen Weg geben, es zu tun.

    
Ramazan Polat 12.11.2012, 20:30
quelle

2 Antworten

13

Wie Daniel erklärte, ist dies beabsichtigt. Lass mich erklären warum:

Der Zustandsautomat ermöglicht das Einreihen von Ereignissen in die Warteschlange. Daher kann es irreführend sein, die Zustandsmaschine nach ihrem aktuellen Zustand zu fragen. Es befindet sich derzeit im Status A, aber es ist bereits ein Ereignis in der Warteschlange, das es in den Status B versetzt.

Außerdem halte ich es für ein schlechtes Design, die internen Zustände der Zustandsmaschine (die Sie in Ihrer Zustandsmaschinendefinition verwenden) direkt mit den externen Zuständen der Zustandsmaschine zu koppeln (die Sie in der Datenbank beibehalten wollen). Wenn Sie diese beiden direkt koppeln, verlieren Sie die Fähigkeit, die Zustandsmaschine intern zu refaktorieren, ohne die Außenseite (in Ihrem Fall die Datenbank) zu beeinflussen. Ich stoße häufig auf das Szenario, in dem ich einen Zustand A aufteilen muss, in A1 und A2, weil ich ihnen verschiedene Aktionen anhängen muss, aber trotzdem haben sie den gleichen Zustand für die Umgebung dargestellt. Daher rate ich Ihnen dringend, die internen und externen Zustände zu trennen, entweder wie Sie mit OnEntryExecute () geschrieben haben oder indem Sie eine Zuordnung bereitstellen und eine Erweiterung verwenden. Dies ist eine Erweiterung, mit der Sie den aktuellen Status erhalten:

%Vor%

Sie können die Erweiterung auf folgende Weise zur Zustandsmaschine hinzufügen:

%Vor%

Natürlich können Sie diese Erweiterung auch direkt verwenden, um auf den aktuellen Status zuzugreifen. Um es noch einfacher zu machen, sollte die Klasse, die den Zustandsautomaten definiert, die Erweiterung implementieren und sich selbst als Erweiterung übergeben. Lassen Sie die Extra-Klasse loswerden.

Eine letzte Anmerkung: Wenn Sie Fragen zu bbv.Common (oder Appccelerate, wie es jetzt heißt) in der Google-Gruppe unter Ссылка , es ist einfacher für mich, die Frage zu finden und zu beantworten; -)

    
Urs 13.11.2012, 12:45
quelle
4

Dies ist beabsichtigt. Wir betrachten die Abfrage des Zustands der Zustandsmaschine als Design-Geruch. Aber natürlich gibt es Ausnahmefälle. Sie haben die folgenden zwei Optionen:

  1. Verwenden Sie die Methoden ExecuteOnEntry , um den Status der Bestellung zu speichern. Dies spiegelt den Weg wieder, denn Sie wollen die Zustände der Staatsmaschine nicht in Ihre Geschäftslogik ausliefern.
  2. Schreiben Sie Ihren eigenen Automaten, der intern StateMachine<TState, TEvent> verwendet. Dies macht den Staat sichtbar.

Daniel

    
Daniel Marbach 12.11.2012 20:58
quelle