If I have a stateful thing with a lifecycle then is the system component
the instance of the thing or a wrapper that contains the thing.
For example, let's say I have a registry of clients that want to be polled
then I might have the following:
(defrecord Registry [state])
(defn register-with [registry cb spec] (swap! (:state registry) :assoc cb
spec))
(defn start [registry] ...)
(defn stop [registry] ...)
(den some-other-thing [..] ....)
Great.
Now I want to expose that and use Stuart's excellent component library
(which I really wish a global 'everything has been defined, now the actual
system is starting' lifecycle event, but anyway). I seem to find most
examples do:
(defrecord RegistryComponent []
component/Lifecycle
(start [this]
(let [registry (->Registry (atom {}))]
(start registry)
(assoc this :registry registry))
(stop [this]
(stop (:registry this))
(assoc this :registry nil)))
Other components get the RegistryComponent but then have to unravel the
actual :registry.
Another approach would be to adjust the actual Registry and that that
implement the lifecycle:
(defn register-with [registry cb spec] (swap! (:state registry) :assoc cb
spec))
(defn start [registry] ...)
(defn stop [registry] ...)
(den some-other-thing [..] ....)
(defrecord Registry [state]
component/Lifecycle
(start [this] (start this) this)
(stop [this] (stop this) this))
On the one hand, the Lifecycle component can be viewed as separate from the
thing it is managing, and this wrapping and unwrapping is only a concern of
Components. Nothing outside of a Lifecycle instance worries about it and
nothing ever receives a Lifecycle instance.
On the other hand, it all felt a little bit OO-ish - and actually I don't
quite see the 'vanilla' Registry implementing the Lifecycle component as
complecting anything inappropriate. The Lifecycle instance is only
describing behaviour - there is no separate 'thing'.
Is that correct or have I missed something? What do you all do?
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.