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