Bibliothek, die den Lebenszyklus staatlicher Komponenten verwaltet. Dies ist eine Variation der Idee des Projekts von https://github.com/stuartsierra/Component. Im Moment unterstützt diese Bibliothek kein ClojureScript.
Fügen Sie diese Abhängigkeit Ihrem Projekt hinzu
[net.readmarks/compost "0.2.0"]
Beispiele finden Sie Tests. Die Komponentenerklärung hat Form
{ :requires #{ :required-component-id-1 :required-component-id-2 }}
:this initial-state
:get ( fn [this] ...) ; ; Returns value of this component that other components will get as dependency.
:start ( fn [this dependency-components-map] ...) ; ; Acquire resources (open connections, start threads ...)
:stop ( fn [this] ...)} ; ; Release resources.Alle Felder sind optional, Standardeinstellungen sind:
{ :requires #{}
:this nil
:get identity
:start ( fn [this dependency-components-map] this)
:stop identity} :start und :stop -Funktionen sollten einen neuen Wert von Komponenten zurückgeben :this . Wenn die Komponente Ressourcen erwirbt in :start muss sie veröffentlichen in :stop . Die Systemerklärung ist eine einfache Karte
{ :component-1-id component-1-declaration
:component-2-id component-2-declaration
...
}Beispiel für Lebenszyklus
( require '[net.readmarks.compost :as compost])
( let [s ( compost/start system-map #{ :web-component :some-worker-component })]
( Thread/sleep 5000 )
( compost/stop s))Sie können den aktuellen Systemstatus nach Ausnahme wie folgt retten:
( try
( compost/start system-map)
( catch ExceptionInfo ex
( if-let [sys ( compost/ex-system ex)]
( compost/stop sys) ; ;; Handle this system as desired here.
( throw ex))))Diese Funktion wird von net.readmarks.compost.keeper Namespace implementiert. Dieser Namespace wird als experimentell angesehen, sein Inhalt könnte sich in jeder Version ändern.
Der Agent ("Keeper") hält den aktuellen Systemstaat zusammen mit den Ausnahmen des Lebenszyklus. Das Nutzungsbeispiel:
( require '[net.readmarks.compost :as compost])
( require '[net.readmarks.compost.keeper :as keeper])
( def sys ( keeper/keeper system-map))
( keeper/update-keeper! sys compost/start)
; ; Now sys holds current system value and errors if there are any.
; ; (:system @sys) is current system map value.
; ; (:errors @sys) is list of of system lifecycle errors. It is empty if system changes were successful.
; ; You can send these errors into a log, for example:
( keeper/flush-errors! sys println) ; ; The function gets errors one by one.Sie können vorhandene Komponenten wie folgt anpassen:
( defn component-using [init using]
{ :requires ( set using)
:this init
:start ( fn [this deps]
( -> ( merge this deps)
component/start)
:stop component/stop})
( def system
{ :conn-source ( component-using
( ->MyConnPool )
[])
:dao ( component-using
( map->MyDbComponent {})
[ :conn-source ])} Beachten Sie, dass im Gegensatz zu com.stuartsierra.comPonent -Sequenz von nrcompost/stop sich von Reverse Startup One unterscheiden kann. Nur explizit deklarierte Abhängigkeiten werden respektiert. Wenn Sie implizite Abhängigkeiten berücksichtigen müssen, sollten Sie Komponenten zusätzliche Elemente hinzufügen :require Sammlungen.
Mir gefällt, was Komponente bietet, aber ich möchte auch
Lifecycle wird im Weg im Weg, wenn Sie nur eine Ad -hoc -Komponente benötigen. Außerdem muss die Komponente eine Karte sein und Lebenszyklus implementieren, die die Komponente effektiv auf einen Datensatz beschränken. Dies bedeutet auch, dass Menschen manchmal auf Arbeiten zurückgreifen, um neue Typen zu erstellen.Copyright © Petr Gladkikh [email protected]
Verteilt unter der Eclipse Public Lizenz entweder Version 1.0 oder (nach Ihrer Option) jede spätere Version.