Yes, I think it can be a valid solution if I use Guice 2.0. In an ideal world, I wish to not force my "contributors" to use such specific kind of bindings (MapBinder + Provider) . My life would be really easier if a kind of "enhanced provider" exists, with the injectee context... :-|
Anyway, thanks Fred for this help! Anthony 2010/1/19 Fred Faber <[email protected]> > Ok, then consider using a MapBinder<TimeOfDay, Provider<ISomething>>. > > Instead of using annotations to identify each different instance of > ISomething, simply associate it to its "time of day" through a key into the > map. Then inject the map into the Provider<ISomething> that I sketched out > above. The provider will determine which entry is closest to the current > time, and use that. > > The provider can also have the default instance of ISomething injected into > it, of course. > > -Fred > > On Tue, Jan 19, 2010 at 10:10 AM, Anthony MULLER <[email protected] > > wrote: > >> 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 :-/ >> >> >> 2010/1/19 Marcos Alcantara <[email protected]> >> >>> "I'd like that Guice call me when it tries to inject, and so I will >>> return the "better" instance. " >>> >>> Isn“t this the provider role? >>> >>> You can extend the Provider class too so you can inject other "context" >>> objects into it and decide which instance would be best for the moment. >>> >>> =) >>> >>> Hope this can help you. >>> >>> Best regards, >>> >>> Marcos Alcantara >>> >>> On Tue, Jan 19, 2010 at 11:56 AM, Anthony MULLER < >>> [email protected]> wrote: >>> >>>> 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]<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]<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.
