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.

Reply via email to