Yeah in general this is not entirely an easy problem.

Without knowing more about your problem specifics, here are some solutions:

First, you can always use what you have, with Modules.override() to override
the annotation binding:

class RealDbModule extends AbstractModule {
    @Override
     protected void configure() {
        bind(...the db provider you show in your mail);
     }
}

Module myTestDbModule = Modules.override(myRealDbModule)
   .with(new AbstractModule() {
          @Override
           protected void configure() {
               bind(Key.get(String.class,
Names.named("database.mysql.username")).toInstance("test");
            }
      }

and you can install this in your private module, or do what you will with
it.

* * *

You can add a crufty solution, such as passing in a constructor arg to your
DbModule:

class DbModule extends AbstractModule {

    private final DbModule(String annotationName) {
        this.annotationName = annotationName;
     }

    @Override
     protected void configure() {
        bind(Database.class).toProvider(new Provider<Database>() {
             @Inject Injector injector;

             @Override
             public Database get() {
               Named named = Names.named(annotationName);
               Key<String> annotationKey = Key.get(String.class, named);
               String dbUser = injector.getInstance(annotaitonKey);
                return new MySqlDatabase(......);
     }
}

I almost didn't want to suggest this, and I'll justify it by saying that I
do it simply to illustrate why it's not a great solution:
1) because who knows through how many other classes you'll need to propagate
the constructor arg
2) because Guice isn't creating your MySqlDatabase instance

* * *

There are other methods along these lines as well.  With more details I can
probably suggest something more appropriate for your case.


2010/1/19 Willi Schönborn <[email protected]>

>  On 17/01/2010 12:14, Willi Schönborn wrote:
>
> On 17/01/2010 00:18, Dhanji R. Prasanna wrote:
>
>
>
> 2010/1/17 Willi Schönborn <[email protected]>
>
>>  On 16/01/2010 18:02, Kartik Kumar wrote:
>>
>> This may help.
>> http://code.google.com/p/google-guice/wiki/BindingAnnotations
>>
>>  No, i dont want to bind multiple Implementations to the same interface, i
>> want to configure (!)
>> multiple instances of the same class independently using annotations
>> (@Named).
>>
>
>  You're referring to the robot legs problem:
> http://code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions
>
>  (look for "robot legs")
>
>
>  An idea? Anyone?
>
> I managed to solve a part of the problem using private modules, but there
> is something left i dont know
> how to do:
>
> Better example:
>     public interface Database
> and
>     class MySqlDatabase implements Database {
>
>         @Named("database.mysql.username")
>         private String username;
>
>     }
>
> Lets assume i actually want to work with two different mysql databases and
>  i have a settings.properties which is bound using Names.bindProperties()
> and contains:
>
> database.mysql.username = test
> database.mysql.second.username = user
>
> I need a way to "override" a constant bound by Names.bindProperties(...)
> in a private module by using the value of another constant binding.
> E.g. I want to set the value of "database.mysql.username" to the value of
> "database.mysql.second.username" in my private module without
> the need to parse the properties file on my own.
>
>
> Dhanji.
>
>
>
> --
> 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.
>
>
>
>
> --
> 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.

Reply via email to