On Fri, 06 Dec 2013 22:57:14 -0200, John Prestel <jpres...@safaribooksonline.com> wrote:

I'm building a service MasterFooProvider that takes contributions of type
FooProvider. I'd really love for one my FooProvider implementations,
ConfigurableFooProvider, to be able to take contributions of its own (of
type String), so its behavior can be customized.

Hello, John!

That's what I'd do, not tested:

* ConfigurableFooProvider is declared as a service.
* Contribute ConfigurableFooProvider to MasterFooProvider normally, but not using addInstance(), because addInstance() doesn't make ConfigurableFooProvider a service, so it cannot receive contributions.

public static void bind(ServiceBinder binder) {
        binder.bind(ConfigurableFooProvider.class).withMarker(Primary.class);
        
binder.bind(SubclassConfigurableFooProvider.class).withId("SubclassConfigurableFooProvider");
}

public static void contributeMasterFooProvider(
        OrderedConfiguration<FooProvider> config,
        @Primary ConfigurableFooProvider configurableFooProvider,
@InjectService("SubclassConfigurableFooProvider") SubclassConfigurableFooProvider) {
        config.add("ConfigurableFoo", configurableFooProvider);
}

public static void contributeConfigurableFooProvider(OrderedConfiguration<String> config) {
        ...
}

To make matters more complicated, I have the need to sub-class
ConfigurableFooProvider, and I don't want the derived classes to share
configuration. In other words, I want to be able to configure/contribute to each sub-class separately.

That's not a problem at all. Just make sure you're contributing to the right service by the right method name

public static void contributeConfigurableFooProvider(OrderedConfiguration<String> config) {

}

public static void contributeSubclassConfigurableFooProvider(OrderedConfiguration<String> config) {

}

To avoid ambiguity, which Tapestry-IoC considers as a showstopper, use a marker annotation or a service id when declaring and injecting ConfigurableFooProvider and declare the subclass as another service. My example above uses the Tapestry-provided @Primary annotation for the superclass and id for the subclass as examples.

--
Thiago H. de Paula Figueiredo
Tapestry, Java and Hibernate consultant and developer
http://machina.com.br
Help me spend a whole month working on Tapestry bug fixes and improvements: http://igg.me/at/t5month

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to