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 <javascript:>> 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 > <javascript:> > > 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 <javascript:> > > 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 <javascript:>. > > 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.