Thanks Fred! But my bindings are "modular"... I don't know them before startup...
In the example, imagine the injectee must be the instance with the time the
closest of injection time. Or, if no "@Timed" is provided, the default
implementation must be injected.
// Example
public class MaClasse {
@Inject // Default injection
private ISomething something;
@Inject @Timed // Timed injection
private ISomething something;
}
Bindings :
ISomething --> DefaultSomethingImpl // Default
"Contributors" can provided bindings like:
ISomething @Named("8:15") --> SomethingMorningImpl // Optional
ISomething @Named("12:30") --> SomethingMiddayImpl // Optional
ISomething @Named("20:55") --> SomethingEveningImpl // Optional
As you see, I don't know the list in advance...
The provider could be a solution, but the problem is I don't have
information on the injectee (in my case: the attached annotations)... So, I
can not control the injection as I wish :-/
Maybe it is possible to do what I wish by using Guice 2.0 and its SPI?
Regards,
Anthony
2010/1/19 Fred Faber <[email protected]>
> Anton's suggestion should do the trick:
>
> class ISomethingProvider implements Provider<ISomething> {
>
> @Inject @ReportsTimeOfDay
> TimeOfDayReporter timeOfDayReporter;
>
> @Inject @Name("morning")
> Provider<ISomething> somethingMorningProvider;
>
> @Inject @Name("midday")
> Provider<ISomething> somethingMiddayProvider;
>
> @Inject @Name("evening")
> Provider<ISomething> somethingEveningProvider;
>
> @Override
> public ISomething get() {
> TimeOfDay timeOfDay = timeOfDayReporter.getTimeOfDay();
> if (timeOfDay.isMorning()) {
> return somethingMorningProvider.get();
> } else if (....) {
> ....
> }
> }
> }
>
>
> and then:
>
> bind(ISomething.class)
> .toProvider(ISomethingProvider.class);
>
>
> * * *
>
> "injection context" is a vague and simultaneous powerful concept, which is
> different from application to application, and even injection to injection.
> the provider construct allows flexible definitions of this context to suit
> each setting.
>
> -Fred
>
> On Tue, Jan 19, 2010 at 9:18 AM, Anthony MULLER
> <[email protected]>wrote:
>
>> Ok!
>>
>> Imagine I have several bindings for ISomething :
>>
>> ISomething @Named("morning") --> SomethingMorningImpl
>> ISomething @Named("midday") --> SomethingMiddayImpl
>> ISomething @Named("evening") --> SomethingEveningImpl
>>
>> At runtime, I know what time is it and I wish that the proper instance is
>> injected according the time:
>>
>> public class MaClasse {
>> @Inject
>> @Timed
>> private ISomething something;
>> }
>>
>> I'd like that Guice call me when it tries to inject, and so I will return
>> the "better" instance.
>>
>> As you see, the framework is not able to decide alone in that case. But if
>> it is possible to plug behaviour at injection time, this case can be
>> resolved.
>>
>> Hoper I'm clearer :-p
>>
>> Regards,
>> Anthony
>>
>>
>> 2010/1/19 Fred <[email protected]>
>>
>>> Could you please give an example? I'm having a hard time interpreting
>>>
>>> what you mean.
>>>
>>> On Jan 19, 8:15 am, Anthony MULLER <[email protected]> wrote:
>>> > Hello,
>>> >
>>> > I can't remember... I work with Guice 1.0.
>>> >
>>> > Is is possible to take the hand when it is written:
>>> >
>>> > public class MaClasse {
>>> >
>>> > @Inject
>>> > private ISomething something;
>>> >
>>> > }
>>> >
>>> > I'd like to write a specific resolution, to choose the "best"
>>> binding....
>>> >
>>> > Thanks,
>>> > Anthony
>>>
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "google-guice" group.
>>> To post to this group, send email to [email protected].
>>> To unsubscribe from this group, send email to
>>> [email protected]<google-guice%[email protected]>
>>> .
>>> For more options, visit this group at
>>> http://groups.google.com/group/google-guice?hl=en.
>>>
>>>
>>>
>>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "google-guice" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected]<google-guice%[email protected]>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/google-guice?hl=en.
>>
>>
>
> --
> You received this message because you are subscribed to the Google Groups
> "google-guice" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<google-guice%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-guice?hl=en.
>
>
-- You received this message because you are subscribed to the Google Groups "google-guice" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to [email protected].
For more options, visit this group at http://groups.google.com/group/google-guice?hl=en.
