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")); ?


        * * *

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

           To unsubscribe from this group, send email to
           [email protected]
        <mailto:google-guice%[email protected]>
           <mailto:google-guice%[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]
        <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]
    <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