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.
