On Mon, 2007-07-02 at 11:03 +0200, Kristian Marinkovic wrote:
> 
> hi martin, 
> 
> if you use the ServiceBinder to contribute a class that implements an
> already 
> "contributed" interface you have to assign an id for your class by
> invoking withId, 
> because the Interface is no longer sufficient to identifiy the service
> 
>  binder.bind(PageTemplateLocator.class, 
>         MyPageTemplateLocatorImpl.class).withId("myLocator"); 
> 
> furthermore you have to contribute to the aliasOverrides Service 
> to actually replace the old implementation: 
> 
> public static void contributeAliasOverrides( 
>             @InjectService("myLocator") PageTemplateLocator locator, 
>             Configuration<AliasContribution> configuration) { 
>              
>    configuration.add( 
>          AliasContribution.create( 
>                  PageTemplateLocator.class, locator)); 

Great, this works - thanx a lot!

Just for clarification: the specified id has to be used anywhere else,
right? E.g. for us the service in question is the MarkupWriterFactory,
and previously we also had this in our AppModule:

    public static PageResponseRenderer decoratePageResponseRenderer(
            @InjectService("PageMarkupRenderer")
            final PageMarkupRenderer markupRenderer,
            @InjectService("MarkupWriterFactory")
            final MarkupWriterFactory markupWriterFactory,
            final Object delegate )

which we have to change to @InjectService("myMarkupWriterFactory") then.
Is this the intended way? Is it guaranteed, that T5 does not reference
the MarkupWriterFactory implementation by the id "MarkupWriterFactory"?

Thanx && cheers,
Martin 


> 
> 
> g, 
> kris 
> 
> 
> 
> Martin Grotzke
> <[EMAIL PROTECTED]> 
> 
> 02.07.2007 10:00 
>         Bitte antworten an
>          "Tapestry users"
>     <users@tapestry.apache.org>
> 
> 
> 
> 
>                An
> Tapestry users
> <users@tapestry.apache.org> 
>             Kopie
> 
>             Thema
> RE: T5 Decoupling
> a Template From
> its Component
> Class
> 
> 
> 
> 
> 
> 
> 
> 
> > Digging through the code I notice there is a PageTemplateLocator
> > interface which seems like the appropriate service to override. What
> I
> > have tried is to add the following method to my AppModule class....
> > 
> > 
> > public static void bind(ServiceBinder binder) {
> >   ServiceBindingOptions options = 
> >                                   binder.bind(
> >
>  PageTemplateLocator.class,
> >
>  MyPageTemplateLocatorImpl.class
> >                                                    );
> > }
> > 
> > 
> > ...but I get the following exception at startup.....
> > 
> > 
> > java.lang.RuntimeException: Service id 'PageTemplateLocator' has
> already
> > been defined by
> 
> Did you solve this issue? I get the same exception with another
> Service
> that's defined in TapestryModule that I want to override in my
> AppModule
> with my custom implementation...
> 
> Thx && cheers,
> Martin
> 
> 
> On Wed, 2007-05-30 at 19:17 -0700, David Kendall wrote:
> > > From: Howard Lewis Ship [mailto:[EMAIL PROTECTED] 
> > > Sent: Wednesday, May 30, 2007 5:15 PM
> > > There are internal services that can be overridden to handle
> those 
> > > kinds of situations.
> > > The goal is to create something that works amazingly well for all 
> > > the more typical cases, then start going after these others.
>  Often 
> > > it will involve moving a private interface out into the public
> space
> > ..
> > 
> > 
> > 
> > 
> > Thanks Howard - I appreciate your prompt response.  However - I am
> not
> > clear if you are saying it cannot be done currently - or if you mean
> > that it can be done - but that I would be treading on somewhat
> unstable
> > ground given that the internal interfaces are subject to change.
> > 
> > Digging through the code I notice there is a PageTemplateLocator
> > interface which seems like the appropriate service to override. What
> I
> > have tried is to add the following method to my AppModule class....
> > 
> > 
> > public static void bind(ServiceBinder binder) {
> >   ServiceBindingOptions options = 
> >                                   binder.bind(
> >
>  PageTemplateLocator.class,
> >
>  MyPageTemplateLocatorImpl.class
> >                                                    );
> > }
> > 
> > 
> > ...but I get the following exception at startup.....
> > 
> > 
> > java.lang.RuntimeException: Service id 'PageTemplateLocator' has
> already
> > been defined by
> >
> org.apache.tapestry.internal.services.InternalModule.build(AssetFactory,
> > ComponentClassResolver) (at InternalModule.java:231) and may not be
> > redefined by
> > org.example.myapp.services.AppModule$MyPageTemplateLocatorImpl() (at
> > AppModule.java:159). You should rename one of the service builder
> > methods.
> > 
> > 
> > 
> > 
> > Am I wasting my time trying this? I can tolerate a certain amount of
> > instability when pulling in subsequent revisions of Tap5 - however -
> I
> > would like to get a proof of concept up and running if at all
> possible.
> > 
> > Any thoughts on this?
> > 
> > Thanks again.
> > 
> > David Kendall
> > 
> > 
> > 
> >
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > 
> -- 
> Martin Grotzke
> http://www.javakaffee.de/blog/
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
-- 
Martin Grotzke
http://www.javakaffee.de/blog/

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to