2010/1/20 Willi Schönborn <[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.



>
>> * * *
>>
>> 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]<google-guice%[email protected]>
>>>>    
>>>> <mailto:[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.

Reply via email to