One thing that will not work is injecting A into either ASub or AOtherSub. Because this will create an endless loop sinc A is bound to ASub resp. AOtherSub. You need to be more specific and either request ACore or introduce a name for the parent so you could inject (@Parent A)
Am 4. Februar 2015 16:59:09 MEZ, schrieb Joshua Moore-Oliva <[email protected]>: >If I am understanding your use case correctly, it sounds like you may >be >interested in using the OptionalBinder that is new in guice4. It would >allow you to set up a default binding (setDefault) in core, and then >override that in a sub (setBinding). > >The javadoc is fairly thorough and has some examples here: > >http://google.github.io/guice/api-docs/latest/javadoc/com/google/inject/multibindings/OptionalBinder.html > > > >On Tuesday, February 3, 2015 at 3:36:28 PM UTC-7, Aurélien wrote: >> >> Hi, >> >> I have a peculiar use case: >> - I have 3 libraries, Core, Sub and OtherSub >> - Sub and OtherSub do not know anything about each other, but they >know >> the existence of Core >> - Sub and OtherSub override the same functionality in Core >> - In a project, I want to combine Sub and OtherSub. >> >> It does not work, but here is how I wanted to implement this pattern >with >> Guice: >> - in the Core library: >> o bind(A.class).to(ACore.class) >> o class ACore implements A { >> @Override public String a() { "a"; } >> } >> - in the Sub library: >> o bind(A.class).to(ASub.class) >> o class ASub implements A { >> private final A parent; // instance of ACore or AOtherSub >> @Inject ASub(A parent) { this.a = parent; } >> @Override public String a() { parent.a() + " overriden"; } >> } >> - in the OtherSub library: >> o bind(A.class).to(AOtherSub.class) >> o class AOtherSub implements A { >> private final A parent; // instance of ACore or ASub >> @Inject ASub(A parent) { this.a = parent; } >> @Override public String a() { parent.a() + " !"; } >> } >> >> then in the projet using this set of libraries, I would have been >able to >> do: >> - Guice.createInjector(Modules.override(new ModuleCore()).with(new >> AOtherSub())).getInstance(A.class).a() // returns "a !" >> - Guice.createInjector(Modules.override(Modules.override(new >> ModuleCore()).with(new ASub())).with(new >> AOtherSub())).getInstance(A.class).a() // returns "a overriden !" >> - Guice.createInjector(Modules.override(Modules.override(new >> ModuleCore()).with(new AOtherSub())).with(new >> ASub())).getInstance(A.class).a() // returns "a ! overriden" >> >> In this implementation, this throws a StackOverflowError because in >ASub >> or in AOtherSub the instance creation falls in an infinite loop. >> >> Is there a way of doing something like that with Guice ? >> Else do you have any insight on how I should implement this use case >? >> >> Cheers, >> Aurélien >> > >-- >You received this message because you are subscribed to the Google >Groups "google-guice" group. >To unsubscribe from this group and stop receiving emails from it, send >an email to [email protected]. >To post to this group, send email to [email protected]. >Visit this group at http://groups.google.com/group/google-guice. >To view this discussion on the web visit >https://groups.google.com/d/msgid/google-guice/940d9eaf-f9d4-44ad-9487-737b76a7b228%40googlegroups.com. >For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "google-guice" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/google-guice. To view this discussion on the web visit https://groups.google.com/d/msgid/google-guice/D6CBA2EC-C080-474D-806E-3FE9430A5145%40gmx.ch. For more options, visit https://groups.google.com/d/optout.
