Ah, I see. So one way to fix this seems to be to make Outer an interface, and then bind an implementation of it. Would that be the correct way of fixing this, or is there a better way?
Thanks! Christopher On Oct 7, 12:59 pm, Alen Vrečko <[email protected]> wrote: > Be careful when exposing bindings without annotation!!! > > Module1: expose(Outer.class) -> Outer.class is now "global" and not > "private" > Module2: > bind(Outer.class).annotatedWith(Names.named("2")).to(Outer.class) > -> the to(Outer.class) actually binds to the exposed binding from > module1! > > Note: If you do bind(Outer.class) in Module2 you will get an error. > > Cheers > Alen > > On Oct 7, 8:00 pm, Christopher Berner <[email protected]> > wrote: > > > > > > > > > I have a class A that depends on an implementation of class B, and I'm > > trying to create two private modules that expose a binding for class > > A, but with different bindings for the class B. However, even though I > > exposed one binding with annotation and one without, I'm still getting > > the same implementation of class B in both cases. > > > I've included some code that demonstrates the problem, if anyone can > > point out what I'm doing wrong I would be very grateful! > > > import org.junit.Assert; > > > import com.google.inject.Guice; > > import com.google.inject.Inject; > > import com.google.inject.Injector; > > import com.google.inject.Key; > > import com.google.inject.PrivateModule; > > import com.google.inject.name.Names; > > > public class Junk { > > public static void main(String[] args) { > > Injector injector = Guice.createInjector(new Module2(), new > > Module1()); > > > Outer outer2 = injector.getInstance(Key.get(Outer.class, > > Names.named("2"))); > > Outer outer1 = injector.getInstance(Outer.class); > > > Assert.assertTrue(outer1.inner instanceof Inner1); > > Assert.assertTrue("Expected Inner2, but got " + > > outer2.inner.getClass(), outer2.inner instanceof Inner2); > > } > > > } > > > interface Inner {} > > class Inner1 implements Inner {}; > > class Inner2 implements Inner {}; > > > class Outer { > > Inner inner; > > > @Inject > > Outer(Inner inner) { > > this.inner = inner; > > } > > > } > > > class Module1 extends PrivateModule { > > @Override > > protected void configure() { > > binder().requireExplicitBindings(); > > bind(Outer.class); > > expose(Outer.class); > > bind(Inner.class).to(Inner1.class); > > } > > > } > > > class Module2 extends PrivateModule { > > @Override > > protected void configure() { > > binder().requireExplicitBindings(); > > > > bind(Outer.class).annotatedWith(Names.named("2")).to(Outer.class); > > expose(Outer.class).annotatedWith(Names.named("2")); > > bind(Inner.class).to(Inner2.class); > > } > > > } -- 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.
