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.


Reply via email to