blob: 35d55cf55febe3da32050af08d178ff7ee84f8a0 [file] [log] [blame]
----
Aliases and Overrides
----
Introduction
Tapestry goes to great lengths so that you can use the
{{{inject.htmll}Inject}} annotation on a field
and provide no additional data, yet end up with the correct object or service.
In many cases, Tapestry must match a field type to an available IoC service.
If there is only single service in the registry that implements the service, Tapestry will utilize that service.
When there is more than one such service, it is necessary to disambiguate which service is to be injected. To disambiguate
globally (across all injections), you must create an alias from the service interface directly to the particular service.
This takes the form of a contribution to the Alias service.
The Alias service has additional purposes: first, it allows for spot overrides on injected services, based on
the application's mode. Currently, the only mode is "servlet", but future modes may include "portlet" and possibly "offline".
Secondly, the companion AliasOverrides service configuration allows for spot overrides of specific services, without disturbing
the rest of the network of services within the IoC Registry.
Contributing an Alias
To contribute a new service to the Alias service, you must first decide on a logical name. Often, this is the
name of the service interface implemented by the service.
You can then contribute into the Infrastructure service's configuration:
+---+
public static void contributeAlias(@InjectService("MyService") MyService myService,
Configuration<AliasContribution> configuration)
{
configuration.add(AliasContribution.create(MyService.class, myService));
}
+---+
The above example follows a typical pattern; the service to be vended is injected into the contributor method, using
the explicit InjectService annotation.
A contribution is made providing the service type.
Notice that the contribution doesn't <have> to be a service; you can just instantiate an object inside the
contribution method and contribute that. That's what we're doing in the example, though we're using a create() static
method rather than <<new>> (just to smooth out some Java Generics ugliness).
Contributing to AliasOverrides
To override a service, you need to know its service interface name.
You can then make a contribution to the AliasOverrides service configuration, as described in the previous section.
The object contributed as an override will mask the default contribution.