merge won't help as there will be name space clashes. I wonder if a more elegant approach would be to construct the 'inner' system and then assoc onto it the external dependencies it needs before calling start.
On 11 March 2015 at 18:49, <adrian.med...@mail.yu.edu> wrote: > I believe I misunderstood your question; I didn't realize it was system (as > opposed to any general component) specific. I think systems can be merged > together (via 'merge'). Would that help? > > On Wednesday, March 11, 2015 at 2:40:14 PM UTC-4, Colin Yates wrote: >> >> 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...@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 clo...@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+u...@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+u...@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. -- 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.