One other thing that I tried was to instantiate the "overriding" class
inside of the overriding method instead of providing a builder method to
create an overriding service, e.g. :

@Contribute(ServiceOverride.class)
    public static void
setupApplicationServiceOverrides(MappedConfiguration<Class,
Object> configuration,
            @Symbol("enableDevFooSvc") Boolean enableDevFoo
            ) {

            if (enableDevFoo) {
                configuration.add(FooService.class, new DevFooService() );
            }
}

For whatever reason, inside my code when I use ObjectLocator to find an
instance of FooService.class, I still get the original instance that I had
tried to override.

Taha - thanks for the suggestion. Unfortunately, the "overriding"
implementation comes from a third party and I need to instantiate it w/ a
specific constructor argument. Now that you mention it, I could probably
try to subclass it with my own implementation that is more Tap IoC aware
(e.g. injects @Symbol-s in the constructor).

Thiago - I can probably try going the decoration route, although it feels a
little bit "not right" -conceptually I want to  'override' the original
implementation.  If I try to decorate the service, do I still have to build
it as a service (e.g. using a service builder method) , or can I
instantiate it as I had shown above (inside of the decorator method)

Cheers - Alex K

On Thu, Feb 28, 2013 at 7:31 PM, Taha Siddiqi <tawus.tapes...@gmail.com>wrote:

> Hi Alex
>
> How about instantiating the service inside the override contribution
> method.
>
> configuration.add(FooService.class,
> objectLocator.autobuild(MyOtherImplementation.class));
>
> regards
> Taha
>
> On Mar 1, 2013, at 4:04 AM, Alex Kotchnev wrote:
>
> > I would like to be able to conditionally override a service inside of a
> > tapestry module (e.g. in the case of DevelopmentModule)
> >
> > My first pass was to declare a new service inside of the development
> > module, e.g. :
> >
> > FooService buildDevFooService() {
> >   ...
> > }
> >
> > and then use the override approach described on the wiki:
> >
> > @Contribute(ServiceOverride.class)
> > public static void
> > setupApplicationServiceOverrides(MappedConfiguration<Class, Object>
> > configuration,
> >            @Local FooService devFooSvc
> >            ) {
> >
> >            configuration.add(FooService.class, devFooSvc);
> > }
> >
> > That works great if I always want to override the service in Development.
> > However, I want to have a symbol that controls which way it goes into
> > development. So, I tried this:
> >
> > @Contribute(ServiceOverride.class)
> >    public static void
> > setupApplicationServiceOverrides(MappedConfiguration<Class, Object>
> > configuration,
> >            @Local FooService devFooSvc,
> >            @Symbol("enableDevFooSvc") Boolean enableDevFoo
> >            ) {
> >
> >            if (enableDevFoo) {
> >                configuration.add(FooService.class, devFooSvc);
> >            }
> > }
> >
> > So, this works great when I enableDevFoo is enabled - the dev specific
> > service overrides the original one. However, if enableDevFoo is false,
> the
> > FooService is not overriden (and it keeps the original implementation).
> >
> > That also works great, until I inject FooService by the service interface
> > class somewhere else. In that case (when enableDevFoo=false) , now there
> > are two implementations of FooService and I have a problem.
> >
> > I thought that I could check the same symbol in buildDevFooService, but
> the
> > builder method complains when I return null (understandably). I thought
> > that it would be nice to somehow disable  the devFooService if
> > enableDevFoo=false, but I didn't find a way to "disable" an existing
> > service.
> >
> > Any ideas how I can accomplish this ?
> >
> > Cheers - Alex K
>
>

Reply via email to