Hi Adrian - I don't follow how that helps integrate two different systems - I wonder if my question was unclear or I am missing something in your answer. Would you mind posting some pseudo code to clarify please?
On 11 March 2015 at 18:32, <adrian.med...@mail.yu.edu> wrote: > You can specify component dependencies using the 'using' function as you > know. As long as you know the key of the component in the system you can > specify this dependency wherever you construct the component. If you want to > parameterize dependencies, write a constructor function which takes the > external dependency as a value. > > On Wednesday, March 11, 2015 at 2:17:12 PM UTC-4, Colin Yates wrote: >> >> I have a non-trivial component which requires a bunch of internal and >> external collaborators to work. This component is itself re-usable. >> >> What I really want to do is have ReusableComponent be a component in a >> system so it can pull its external collaborators. However, ReusableComponent >> constructs its own services etc. so it really want to be (or at least have >> access to) a system. >> >> For example, let's say I have the following: >> >> (defrecord InternalToReusableComponent [bus] >> (component/Lifecycle >> (start [this]...)) >> >> (defrecord ReusableComponent [bus logger] >> (component/Lifecycle >> (start [this] >> >> this) >> ....)) >> >> (defn reusable-component-system [external-collaborator] >> (component/system-map >> :bus (....) >> :logger (....) >> :reusable-component (component/using (map->ReusableComponent {}) [:bus >> :logger external-collaborator])) >> >> Fine - I now have a system from which I can pull the reusable component. >> However, where does 'external-collaborator' come from? Obviously there is a >> larger system which I want this component to be part of so I can do: >> >> (defn larger-system [] >> (component/system-map >> :external-collaborator (...) >> :reusable-component (component/using (some-magic-glue) >> [:external-collaborator]))) >> >> I am struggling to see what (some-magic-glue) should be. I imagine it >> needs to be something like: >> >> (defrecord SystemAdaptor [external-collaborator internal-system] >> component/Lifecycle >> (start [this] >> (let [internal-system (or internal-system (reusable-component-system >> external-collaborator)) >> internal-system (component/start internal-system)] >> (assoc this :internal-system internal-system))) >> (stop [this] >> (let [internal-system (:internal-system this) >> internal-system (component/stop internal-system] >> (assoc this :internal-system internal-system))) >> >> but it all feels a bit yuck. >> >> I can't merge the two systems because the reusable component is chocka >> full of very fine grained command handlers and both the internal and >> external systems will have their own 'bus' for example. I could namespace >> the keys but that again feels painful... >> >> Hope that is clear - and I look forward to your thoughts :). > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > 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 clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com 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 clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.