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.
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; -)
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:
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. StateMachine<TState, TEvent>
verwendet. Dies macht den Staat sichtbar. Daniel
Tags und Links c# finite-state-machine state-machines