2010/1/20 Willi Schönborn <[email protected]> > Fred Faber wrote: > >> >> >> 2010/1/20 Willi Schönborn <[email protected] <mailto: >> [email protected]>> >> >> >> 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? >> >> >> I imagine so, sure, but that seems like it has solutions that are >> independent of guice and more specific to how you want to read the file. As >> far as design of the modules, "test" doesn't need to be hardcoded and there >> can be any logic that reads the file substituted in its place. >> > Reading a properties file on my own is exactly what i want to avoid ;) > Can i do: > binder.bind(Key.get(String.class, > Names.named("database.mysql2.username")).to(Key.get(String.class, > Names.named("database.mysql.username")); ? >
This is the concept of a bridging binding, whereby the biding attached to
one Key is going to be bridged (effectively transfered, if you will) to a
binding attached to another key.
You can make this general by a simple class:
class BridgingProvider<T> implements Provider<T> {
private static <T> ScopingBindingBuider bindBridge(
Binder binder,
Key<T> keyToBridge,
Class<? extends Annotation> bridgeAnnotation) {
Provider<T> bindingProvider = new BridgingProvider(keyToBridge);
Key<T> bridgedKey =
Key.get(keyToBridge.getTypeLiteral(), bridgeAnnotation);
return binder.bind(keyToBridge).toProvider(bindingProvider);
}
private static final Key<T> keyToBridge;
@Inject
Injector injector;
private BridgingProvider(Key<T> keyToBridge) {
this.keyToBridge = keyToBridge;
}
@Override
public T get() {
T bridgedInstance injector.getInstance(keyToBridge);
return bridgedInstance;
}
}
and then:
BridgingProvider.bindBridge(
binder(),
Key.get(String.class, Names.named("database.mysql2.username")),
Names.named("database.mysql.username"));
Which will inject whatever is bound to "Key.get(String.class,
Names.named("database.mysql2.username"))" as the value when asked to inject
something with the key, "Key.get(String.class,
Names.named("database.mysql.username")).
-Fred
>>
>>
>> * * *
>>
>> 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]>
>> <mailto:[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]>
>> <mailto:[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]>
>> <mailto:[email protected]
>> <mailto:[email protected]>>.
>>
>> To unsubscribe from this group, send email to
>>
>> [email protected]<google-guice%[email protected]>
>>
>> <mailto:google-guice%[email protected]<google-guice%[email protected]>
>> >
>>
>> <mailto:[email protected]<google-guice%[email protected]>
>>
>> <mailto:google-guice%[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]
>> <mailto:[email protected]>
>> <mailto:[email protected]
>> <mailto:[email protected]>>.
>>
>> To unsubscribe from this group, send email to
>>
>> [email protected]<google-guice%[email protected]>
>>
>> <mailto:google-guice%[email protected]<google-guice%[email protected]>
>> >
>>
>> <mailto:google-guice%[email protected]<google-guice%[email protected]>
>>
>> <mailto:google-guice%[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]
>> <mailto:[email protected]>.
>> To unsubscribe from this group, send email to
>>
>> [email protected]<google-guice%[email protected]>
>>
>> <mailto:google-guice%[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]
>> <mailto:[email protected]>.
>> To unsubscribe from this group, send email to
>>
>> [email protected]<google-guice%[email protected]>
>>
>> <mailto:google-guice%[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.
