Die gleiche Logik ist immer noch vorhanden. Das Datenladeteil wurde in die umschlossene Funktion extrahiert, während die gesamte Abbruchlogik im Dekorator verdaneben ist. Der einzige andere Unterschied ist, dass wir eine speziell modifizierte Version von fetch injizieren, die automatisch das Signal des Dekorators übergeben wird. Diesem Muster ist eine wichtige Kontextbedingung zugeordnet: Die Löschung eines ausgeführten Falls muss als erfolgloser Abschluss der Anfrage angesehen werden. Dies bedeutet, dass, obwohl der Fall in geordneter Weise beendet wurde, vielleicht sogar mit Token, die ihren Endpunkt erreichen, dies in keiner Weise als ein erfolgreiches Ergebnis interpretiert werden sollte. Wenn z. B. ein Protokoll von Ereignissen gespeichert wird, die während der Prozessausführung auftreten, sollte die Anfrage als unvollständig oder abgebrochen aufgezeichnet werden. Auch hier mag ich durch meine Unkenntnis mit Schauspielern/MailboxProcessor voreingenommen sein, aber persönlich finde ich folgendes leichter zu verstehen.

Es gibt weniger Typen, keine Nachrichten außer der MVU-Schleife und keine eigenständigen Subsysteme (Akteure) zu verstehen. Es sind nur Funktionen, die Funktionen aufrufen. (Ich habe in diesem Beispiel keine “DI”/Partielle Anwendung durchgeführt, aber das ist natürlich möglich, um anzupassen. Auch sage ich nicht, die genauen Besonderheiten unten gezeigt sind die optimalen – dies war nur die erste vernünftige Sache, die in den Sinn kam, die meinen Hauptpunkt zeigt.) Während eines Versicherungsanspruchsprozesses wird festgestellt, dass die Richtlinie abgelaufen ist, und infolgedessen werden alle Aufgaben, die mit der jeweiligen Prozessinstanz verknüpft sind, abgebrochen. Es gibt viele neue Cmds in Fabulous, die nicht in Elmish sind – ich denke, wenn wir mit einem `wenn es nicht in Elmish ist, brauchen wir es nicht` Ansatz beginnen, dann könnten wir einige tolle Ideen aussperren, die die Dinge einfacher machen, aber ich bekomme deinen Punkt total. Wie geht Elmish mit der Stornierung um? Oder die Staatliche Verwaltung im Allgemeinen? Der einfachste Weg, dies zu tun, ist, die vorherige Anforderung zu stornieren.2 Hier sieht das aus, wenn man die Fetch-API verwendet: Im Allgemeinen in Bezug auf Polly: Resilience-Muster sind auf der grundlegenden Ebene einfach, aber reale Bedenken und Edge-Fälle können jede Implementierung schnell ziemlich komplex machen (ich habe versucht, gescheitert, schaute mir den Polly-Code an und entschied mich dann, meine Verluste zu reduzieren). Ich bin mehr als glücklich, (was ich verstehe) die De-facto-Standard.NET Resilienzbibliothek behandeln zu lassen, dass für mich. 🙂 Als großes Plus ist es sehr einfach, andere unterstützte Richtlinien wie Leistungsschalter, Timeouts, Fallbacks usw.

einzustecken und zusammen zu komponieren. Abbildung 30 zeigt einen allgemeineren Ansatz für die Kündigung. Dies kann verwendet werden, um einzelne Aufgaben, Regionen oder sogar ganze Fälle abzubrechen. Sie basiert auf der Erstellung einer alternativen “Bypass”-Aufgabe für jede Aufgabe in einem Prozess, der möglicherweise abgebrochen werden muss. Wenn ein Abbruch initiert wird, wird die Anfrage weiter verarbeitet, aber die “Bypass”-Aufgaben werden ausgeführt und nicht die normalen Aufgaben, so dass in der Tat keine weitere Arbeit an dem Fall tatsächlich erreicht wird. Sie sagten, Ihr Beispiel sei nur eine Einzige Anfrage, also habe ich auch das modelliert. Ich war mir nicht sicher, ob Ihr Beispiel dazu gedacht war, generische Anfragen oder eine bestimmte Anfrage zu behandeln, aber ich habe letzteres erraten und deshalb beschlossen, es etwas Konkretes zu nennen, d.h. SignIn. Wenn ich mehrere parallele, abschreibbare Anforderungen unterstützen musste (für andere Anwendungsfälle als das Anmelden), könnte ich eine Lösung ähnlich wie zuvor beschrieben erstellen, bei der ich eine Trackerzeichenfolge übergeben kann, die ich später verwenden kann, um die Anforderung abzubrechen. Die Lösung wäre nur etwas komplexer: ConcurrentDictionary-String, CancellationTokenSource> anstelle eines einzelnen CTS, Entfernen nach Abschluss der Anforderung und Hinzufügen der Tracker-Zeichenfolge als zu sendendem Parameter.