Thanks for the reply, i left a comment below.
Fred Faber wrote:
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.
That what i was thinking, but is there a nice way to retrieve "test" from
a properties file instead of hardcoding it to the module?
* * *
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]
<mailto:[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]
<mailto:[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]
<mailto:[email protected]>.
To unsubscribe from this group, send email to
[email protected]
<mailto:[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]
<mailto:[email protected]>.
To unsubscribe from this group, send email to
[email protected]
<mailto: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.
--
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.