Perpustakaan yang mengelola siklus hidup komponen stateful. Ini adalah variasi dari ide proyek https://github.com/stuartsierra/component. Saat ini perpustakaan ini tidak mendukung Clojurescript.
Tambahkan ketergantungan ini ke proyek Anda
[net.readmarks/compost "0.2.0"]
Lihat tes untuk contoh. Deklarasi komponen memiliki bentuk
{ :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.Semua bidang adalah opsional, default adalah:
{ :requires #{}
:this nil
:get identity
:start ( fn [this dependency-components-map] this)
:stop identity} :start dan :stop functions harus mengembalikan nilai baru komponen :this . Jika komponen memperoleh sumber daya di :start itu harus melepaskannya di :stop . Deklarasi sistem adalah peta biasa
{ :component-1-id component-1-declaration
:component-2-id component-2-declaration
...
}Contoh Penggunaan Siklus Hidup
( require '[net.readmarks.compost :as compost])
( let [s ( compost/start system-map #{ :web-component :some-worker-component })]
( Thread/sleep 5000 )
( compost/stop s))Anda dapat menyelamatkan status sistem saat ini setelah pengecualian sebagai berikut:
( 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))))Fitur ini diimplementasikan oleh net.readmarks.compost.keeper namespace. Namespace ini dianggap eksperimental, isinya mungkin berubah dalam versi apa pun.
Agen ("penjaga") memiliki kondisi sistem saat ini bersama dengan pengecualian siklus hidup. Contoh Penggunaan:
( 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.Anda dapat mengadaptasi komponen yang ada sebagai berikut:
( 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 ])} Perhatikan bahwa tidak seperti com.stuartsierra. Urutan nrcompost/stop mungkin berbeda dari startup terbalik satu. Hanya dependensi yang dinyatakan secara eksplisit yang dihormati. Jika Anda perlu memperhitungkan dependensi implisit, Anda harus menambahkan elemen tambahan ke komponen ' :require koleksi.
Saya suka komponen apa yang disediakan tetapi saya juga ingin
Lifecycle menghalangi ketika Anda hanya membutuhkan komponen ad hoc. Juga persyaratan untuk komponen untuk menjadi peta dan mengimplementasikan siklus hidup secara efektif membatasi komponen untuk menjadi catatan. Ini juga berarti bahwa kadang-kadang orang terpaksa bekerja untuk menghindari menciptakan tipe baru.Hak Cipta © Petr Gladkikh [email protected]
Didistribusikan di bawah Lisensi Publik Eclipse Versi 1.0 atau (atas opsi Anda) versi selanjutnya.