Tapestry
  1. Tapestry
  2. TAPESTRY-2486

Refactor the non-trivial BindingFactory implementations into services

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 5.0.13
    • Fix Version/s: 5.0.15
    • Component/s: tapestry-core
    • Labels:
      None

      Description

      My actual problem:
      I would like to replace BindingConstants.MESSAGE with my own implemention.
      This is currently not possible because MessageBindingFactory is not IOC Service. ( I could decorateComponentMessageSsource etc. but this is not enough for me, because i need access to the ComponentResources )

      General Solution :
      Make MessageBindingFactory a IOC service then I could override with contributeAliasOverrides(...)
      This may also make sence for other objects , which are currently instatiated with "new" in TapestryModule.java

      http://tapestry.apache.org/tapestry5/tapestry-ioc/overview.html says:
      "The problem with new is that it rigidly connects one implementation to another implementation. Let's follow a progression that reflects how a lot of projects get written. It will show that in the real world, new is not as simple as it first seems."

      Another soultion:

      Allow MappedConfiguration.add to overwrite serviceId's ( with warning ).

      -------------------------------------- instantiotion of MessageBindingFactory with "new" -----------------------------
      public static void contributeBindingSource(MappedConfiguration<String, BindingFactory> configuration,

      @InjectService("PropBindingFactory")
      BindingFactory propBindingFactory,

      ObjectLocator locator)

      { configuration.add(BindingConstants.LITERAL, new LiteralBindingFactory()); configuration.add(BindingConstants.PROP, propBindingFactory); configuration.add(BindingConstants.COMPONENT, new ComponentBindingFactory()); configuration.add(BindingConstants.MESSAGE, new MessageBindingFactory()); configuration.add(BindingConstants.VALIDATE, locator.autobuild(ValidateBindingFactory.class)); configuration.add(BindingConstants.TRANSLATE, locator.autobuild(TranslateBindingFactory.class)); configuration.add(BindingConstants.BLOCK, new BlockBindingFactory()); configuration.add(BindingConstants.ASSET, locator.autobuild(AssetBindingFactory.class)); configuration.add(BindingConstants.VAR, new RenderVariableBindingFactory()); configuration.add(BindingConstants.NULLFIELDSTRATEGY, locator.autobuild(NullFieldStrategyBindingFactory.class)); }

        Activity

        Hide
        Howard M. Lewis Ship added a comment -

        One way of accomplishing this would be to introduce a whole slew of marker annotations. Instead, following the pattern of PropBindingFactory, which is injected by service id. You can decorate a service to partially or fully replace it.

        Show
        Howard M. Lewis Ship added a comment - One way of accomplishing this would be to introduce a whole slew of marker annotations. Instead, following the pattern of PropBindingFactory, which is injected by service id. You can decorate a service to partially or fully replace it.
        Hide
        Howard M. Lewis Ship added a comment -

        I think, ultimately, this will be addressed by adding an override() method to MappedConfiguration.

        Since all the binding factories have the same interface, we would have to inject them by service id (like PropBindingFactory) or introduce marker annotations for them. That still leaves us a little hard up to find a way to override the service (since it will be referenced by service id, or by marker interface), though you could decorate the original service.

        Show
        Howard M. Lewis Ship added a comment - I think, ultimately, this will be addressed by adding an override() method to MappedConfiguration. Since all the binding factories have the same interface, we would have to inject them by service id (like PropBindingFactory) or introduce marker annotations for them. That still leaves us a little hard up to find a way to override the service (since it will be referenced by service id, or by marker interface), though you could decorate the original service.

          People

          • Assignee:
            Howard M. Lewis Ship
            Reporter:
            Fritz Pröbstle
          • Votes:
            1 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development