Thanks a lot Stuart. Great solution. The two seeds of your solution (which, I think, are worth repeating for reference) are as follows: (a) @Provides method get injected (b) The "current" injector is auto-magically bound to the Injector type
-Itay http://twitter.com/pembleton On Sun, Jun 13, 2010 at 7:26 AM, Stuart McCulloch <[email protected]> wrote: > On 10 June 2010 21:57, Itay Maman <[email protected]> wrote: > >> Hi Guys, >> >> I posted my problem as a SO question: >> http://stackoverflow.com/questions/3014140. >> If someone has a solution I'd be grateful if he could post it (either >> here or at SO) >> > > answered over at SO, copied here... > > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > Here's one solution based on your original code - there are three changes: > > 1. Move the bindings for A, C, and D into a separate sub-module > 2. Mark A as a singleton in the sub-module > 3. Use a @Provides method in the main-module to provide instances of > BImpl with > a new child injector for each request - this is where the sub-module > comes in > > This works because the singleton binding for A is now limited to each child > injector. > > [ Note: you could always cache the sub-module instance in a field of the > main-module if you don't want to keep creating it for each request of B ] > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > import java.util.*; > > > import com.google.inject.*; > > public class Main { > > public static class Super { > > private static Map<Class<?>,Integer> map = new > HashMap<Class<?>,Integer>(); > > > private Integer value; > > public Super(Object... args) { > > > value = map.get(getClass()); > > value = value == null ? 0 : ++value; > > > map.put(getClass(), value); > > if(args.length > 0) > > System.out.println("Created " + this + " with " + > Arrays.toString(args)); > > > } > > @Override > public final String toString() { > > > return "" + getClass().getSimpleName().charAt(0) + value; > > > } > } > > public interface A { } > > public static class AImpl extends Super implements A { } > > > public interface B { } > > public static class BImpl extends Super implements B { > > > @Inject public BImpl(C c, D d) { super(c,d); } > > > } > > public interface C { } > > public static class CImpl extends Super implements C { > > > @Inject public CImpl(A a) { super(a); } > > > } > > public interface D { } > > public static class DImpl extends Super implements D { > > > @Inject public DImpl(A a) { super(a); } > > > } > > public static class MyModule extends AbstractModule { > > > @Override > protected void configure() {} > > // >>>>>>>> > @Provides > B builder( Injector injector ) { > > > return injector.createChildInjector( new SubModule() ).getInstance( > BImpl.class ); > > > } > // <<<<<<<< > } > > // >>>>>>>> > > public static class SubModule extends AbstractModule { > > > @Override > protected void configure() { > > bind(A.class).to(AImpl.class).in( Scopes.SINGLETON ); > > > bind(C.class).to(CImpl.class); > > bind(D.class).to(DImpl.class); > > } > } > // <<<<<<<< > > public static void main(String[] args) { > > > Injector inj = Guice.createInjector(new MyModule()); > > > inj.getInstance(B.class); > > inj.getInstance(B.class); > > } > } > > > Thanks, >> -Itay >> >> http://twitter.com/pembleton >> >> -- >> 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. >> >> > -- > Cheers, Stuart > > -- > 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.
