hmm. it looks complicated.
At he beginning I just wanted to do that : @ToDot IDrawGraphService drawDotService = drawGraphInjector.getInstance(IDrawGraphService.class); @ToText IDrawGraphService drawTextService = drawGraphInjector.getInstance(IDrawGraphService.class); So it was easy to choose an implementation. (just need an annotation). I thought that Google guice is cool. But guice annotation doesn't work on local variable. So if we can't do that easily. I think I prefer the old method. jérémie On 19 juil, 21:07, Sam Berlin <[email protected]> wrote: > Ahh -- sorry, i didn't get that you were wanting the client to choose which > one to use. In that case, take a look at MapBinder > @http://code.google.com/p/google-guice/wiki/Multibindings. Set up a > MapBinder where you bind a Map<Class<? extends Annotation>, > IDrawGraphService>, and add a binding into that MapBinder for each of your > implementations. Then your client injects Map<Class<? extends Annotation>, > IDrawGraphService> and calls map.get(TheAnnotationItWants.class) and gets > the proper implementation. (You can also use enums for the keys, or any > arbitrary other type, which might be clearer.) > > sam > > > > On Mon, Jul 19, 2010 at 2:48 PM, Jerem's <[email protected]> wrote: > > Yeah I know that. but It is not really what I want. > > If I do that : > > > @Inject > > public Client(@ToDot IDrawGraphService service) { > > .. } > > > service can only be a DrawDotServiceImpl. but how can I have a > > DrawTextServiceImpl? > > I wuld like that the client can choose the implementation. > > Here, he can't. > > > may I can build a new class client2. > > > @Inject > > public Client2(@ToText IDrawGraphService service) { > > .. } > > > But I don't like to have two kinds of ciient. > > > Jérémis > > > On 19 juil, 19:37, Sam Berlin <[email protected]> wrote: > > > Add an annotation to your injected variable, like: > > > > �...@inject public Client(@YourBindingAnnotation IDrawGraphService > > > service) > > { > > > .. } > > > > That tells Guice that when it injects the constructor with variables, it > > > should inject the graph service that was annotated with that binding > > > annotation. > > > > sam > > > > On Mon, Jul 19, 2010 at 12:45 PM, Jerem's <[email protected]> wrote: > > > > Thanks sam. > > > > > that's not cool that Annotation don't work for local variable. > > > > > I try the second version. IT works. thanks :). > > > > But I don't really like it. > > > > > So I try the first version. Bit it is not really clear in my mind. > > > > I create a client class : > > > > > public class Client { > > > > > private IDrawGraphService service; > > > > > �...@inject > > > > public Client(IDrawGraphService service) { > > > > super(); > > > > this.service = service; > > > > } > > > > > public void executeService(ISimpleGraph graph, String path) > > throws > > > > IOException { > > > > service.draw(graph, path); > > > > } > > > > } > > > > > but Don"t really see hos decide hos to decided is the service is a > > > > drawTextServiceImpl or a drawDotServiceImpl > > > > > jérémie > > > > > On 19 juil, 17:39, Sam Berlin <[email protected]> wrote: > > > > > Guice cannot detect annotations on local variables this way (although > > > > it's > > > > > an interesting idea!). You have two options here: > > > > > > 1) Make the variable on the class wherever this code is in and add > > an > > > > extra > > > > > module that has requestInjection(YourClass.this) in its configure > > method. > > > > > Then Guice will inject that variable as part of its Injector > > creation. > > > > > 2) Use injector.getInstance(Key.get(IDrawGraphService.class, > > > > ToDot.class)) > > > > > instead. That tells Guice that you want to retrieve the instance > > defined > > > > by > > > > > the Key "@ToDot IDrawGraphService", as opposed to just > > > > "IDrawGraphService". > > > > > > sam > > > > > > On Mon, Jul 19, 2010 at 11:21 AM, Jerem's <[email protected]> > > wrote: > > > > > > Hello I try to use annotatoij on a local variable : > > > > > > > this is my module : > > > > > > > public class DrawModule extends AbstractModule { > > > > > > > �...@override > > > > > > protected void configure() { > > > this.bind(IDrawGraphService.class).annotatedWith(ToDot.class).to(DrawDotSer > > > > viceImpl.class); > > > > > > } > > > > > > } > > > > > > > and my Annotation look like that : > > > > > > > @Retention(RUNTIME) > > > > > > @Target({ LOCAL_VARIABLE, FIELD, PARAMETER }) > > > > > > @BindingAnnotation > > > > > > public @interface ToDot { > > > > > > > } > > > > > > > and I try to do that : > > > > > > > Injector drawGraphInjector = Guice.createInjector(new > > DrawModule()); > > > > > > @ToDot > > > > > > IDrawGraphService drawDotService = > > > > > > drawGraphInjector.getInstance(IDrawGraphService.class); > > > > > > > But I have an exception : > > > > > > > Exception in thread "main" > > com.google.inject.ConfigurationException: > > > > > > Guice configuration errors: > > > > > > > 1) No implementation for > > > > > > fr.irisa.cairn.simpleGraph.drawGraph.service.IDrawGraphService was > > > > > > bound. > > > > > > while locating > > > > > > fr.irisa.cairn.simpleGraph.drawGraph.service.IDrawGraphService > > > > > > > 1 error > > > > > > at > > > > com.google.inject.InjectorImpl.getProvider(InjectorImpl.java:784) > > > > > > at > > > > com.google.inject.InjectorImpl.getProvider(InjectorImpl.java:743) > > > > > > at > > > > com.google.inject.InjectorImpl.getInstance(InjectorImpl.java:793) > > > > > > at > > > fr.irisa.cairn.test.simpleGraph.runTimeTest.Launch.Main.main(Main.java: > > > > > > 25) > > > > > > > do you know why? > > > > > > > jérémie > > > > > > > -- > > > > > > 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%2bunsubscr...@google > > > > > > groups.com> > > <google-guice%[email protected]<google-guice%252bunsubscr...@g > > ooglegroups.com> > > > > > <google-guice%2bunsubscr...@google groups.com> > > > > > > . > > > > > > 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%2bunsubscr...@google > > > > groups.com> > > <google-guice%[email protected]<google-guice%252bunsubscr...@g > > ooglegroups.com> > > > > > . > > > > 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%2bunsubscr...@google > > groups.com> > > . > > 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.
