another interesting IoC framework. Wire.JS
Antranig Basman
antranig.basman at colorado.edu
Mon Jul 23 19:23:48 UTC 2012
Thanks, Alexey, this is indeed a helpful explanation motivating IoC. Actually I met Brian at the jsconf
presentation where he delivered these slides and found him a very pleasant and highly switched-on chap :)
Unlike require.js, wire.js is indeed a "true IoC framework" in the sense I described in my earlier message
on this thread - it is capable of recursive dependency resolution, and the bindings of names onto
implementations are encoded in declarative structures rather than in code. It is aimed at many of the same
goals as our framework - a "wiring specification" meets many of the goals of the declarative specification
which we provide in our "defaults blocks".
wire.js is ahead of our framework in providing facilities in some areas, and behind in some other areas. A
lot of its idiom is determined by aiming for the maximum possible naturalness and idiom in interacting with
the node.js/Commons module loading specification, which we've decided for some time (and especially more
recently with our GPII work) isn't a broad enough base for us to build on for Fluid's aims.
In particular, wire.js has these advantages:
i) An official and regular set of lifecycle points for components (5-stage model described at
https://github.com/cujojs/wire/wiki/Component-lifecycles ) - this is something we have had on the cards for
a while but so far only have "events" covering phases of early initialisation (preInit, postInit, etc.). The
required extension for us is JIRAed at http://issues.fluidproject.org/browse/FLUID-4257
ii) A natural ability to name and load an implementation from a (node) module using syntax like create: {
module: 'hello-wired',
since our scheme for code loading in Fluid only has a sketch implementation (the "fluid.require" system
which directly invokes platform require) we currently operate a simple scheme which assumes that all
necessary code has already been loaded.
iii) Good support for asychronously completing activities through the use of "promises" described on
https://github.com/cujojs/wire/wiki/Factories - this allows CommonsJS compliant "promises" to be used to
govern a wiring sequence. We plan to support such facilities in the future through an extension of our
"event boiling syntax", our existing implementation described here:
http://wiki.fluidproject.org/display/docs/Event+injection+and+boiling
iv) Good support for orchestrating DOM insertion (including templating) and querying activities in amongst
component initialisation. Currently our renderer in Fluid, although offering very good decoupling between
markup and components, is very inflexible in its timing and behaves badly in scenarios where rendering
components are nested. It is also tightly integrated into our component grade structure via
"rendererComponent" and so hard to replace.
Fluid supplies a mature "events" system to deal with points i) and iii) but currently offers no framework
support to guide the operation of component lifecycle points and incorporating asynchronous activities into
the wiring (configuration) sequence - the user at the moment is on their own.
There are the following areas where the dynamism provided by wire.js isn't enough for our needs:
a) Whilst module dependency specification has been shifted out into configuration material, it is not easy
to allow for "polymorphism" in implementation. wire.js has no equivalent to our demands blocks system, which
allow an integrator or other developer to selectively override parts of a configuration used by a 3rd party,
whilst retaining others. wire.js provides for this use case via its "aop" and "facets" system which are
based on function handles containing code, rather than operating on configuration directly. wire.js does
provide the "prototype" system ( https://github.com/cujojs/wire/wiki/Factories ) which can be seen as
similar to our "grades" system, allowing new names to be created for new implementations - however, there is
no facility for existing implementations to be modified based on context of use.
b) The absence of stable global names in wire.js (inherited from the modules system) makes it even harder to
deal with point a) - an implementation may be imported from a module, but cannot be reliably identified or
contrasted with or combined with other implementations in other modules.
c) The particular models for asynchrony (promises) and DOM binding (special syntax for referring to
elements) are not sufficiently "open". In practice there are multiple models for asynchronous processes
(indeed, there are multiple Promises libraries even within JS, ignoring other models such as Actors/Monads
etc. ) and it is impractical to expect all users to commit to exactly one model as "primary" and use
adaptors to express every other model in these terms (even if this is possible, in practice it often isn't).
Similarly, DOM binding lacks our model for indirection using the "DOM binder" which allows integrators or
other developers to find a well-defined place for all DOM binding information where it may be overridden or
reconfigured.
A big foundational difference can be seen on the wire.js page on contexts -
https://github.com/cujojs/wire/wiki/Contexts - In Fluid IoC, *every* component automatically becomes usable
as a context, rather than there being a separate concept of "context objects". Whilst wire.js contexts do
form a hierarchy, each individual context is "flat". In this example -
https://github.com/cujojs/wire/wiki/connect-things - the references "component1.doSomethingBefore" etc. can
be seen as somewhat analogous to a Fluid IoC value reference "{component1}.doSomethingBefore" - but the
referential power of the 1st path component in wire.js is weaker - it must refer to a component explicitly
configured with that name in this or a parent context.
There are various other points of difference that could be viewed at length, but hopefully this is enough to
give a reasonable idea of the major points of similarity and difference in implementation and philosophy.
Certainly it is comforting to know that there is at least some other work on "strong IoC" in the JavaScript
community, which should help familiarise the community with these concepts.
Cheers,
Antranig
On 29/06/2012 10:04, Novak, Alexey wrote:
> It has a very well explained concept and why would you consider IoC (I find it by far one of the best
> explanations)
> If you step through all slides there will be a link to github.
>
>
> http://briancavalier.com/presentations/wirejs-2011-jsconf/#0
More information about the fluid-work
mailing list