Pretty sure you can just ask for the Injector in your factory:

class SomeFactory {
 @Inject Injector guice;
}

I've typically injected the Provider instead:

class SomeFactory {
   @Inject Provider<SomeService> provider;
}

The bad news is this is kind of annoying boilerplate.  The good news is that
you should have to do it very infrequently, if your API has low surface
area.



On Tue, Sep 15, 2009 at 10:00 AM, Gili Tzabari <[email protected]>wrote:

>
> Hi Logan,
>
>        Good point!
>
>        I think I am going to try a dual model:
>
> 1) Expose Guice in the public API
> 2) Provide a bridge layer that wraps Guice in factory classes
>
>        Then depending on the demand I will either keep or drop #2 over
> time.
>
>        How do you implement the factories though? Do you do the following?
>
> class InjectorProvider
> {
>        private static final ThreadLocal<Injector> injector = new
> ThreadLocal<Injector>();
>
>        public static Injector get()
>        {
>                return injector.get();
>        }
> }
>
> class StatefulFactory
> {
>        public void doSomething()
>        {
>                Injector injector = InjectorProvider.get();
>                // do stuff
>        }
> }
>
>        Or is there a better way?
>
> Thanks,
> Gili
>
> Logan Johnson wrote:
> > What's forcing you to expose StatefulClass' constructor?  Why not
> > provide a factory for StatefulClass as well?
> >
> >
> >
> > On Mon, Sep 14, 2009 at 11:38 PM, Gili <[email protected]
> > <mailto:[email protected]>> wrote:
> >
> >
> >     Hi,
> >
> >     A few months ago I asked whether one should expose Guice in public
> >     APIs or hide it. I was advised to use Guice under the hood (to
> improve
> >     testability) and expose factory classes to end-users. Here is what
> >     I've got so far:
> >
> >
> >     /** For internal use */
> >     class StatelessClass
> >     {
> >      @Inject
> >      public StatelessClass(OtherClass other);
> >
> >      public Integer toInteger(String text);
> >     }
> >
> >     /** For end-users */
> >     class StatelessClassFactory
> >     {
> >      public static StatelessClass getInstance();
> >     }
> >
> >     /** For end-users */
> >     class StatefulClass
> >     {
> >      public StatefulClass(String arg1, String arg2);
> >
> >      public doSomething();
> >     }
> >
> >         So users instantiate StatelessClass using
> >     StatelessClassFactory.getInstance() which uses an Injector under the
> >     hood. They use "new StatefulClass()" to get an instance of
> >     StatefulClass. But then what happens if StatefulClass needs to
> >     reference StatelessClass? If I use StatelessClassFactory it makes
> >     StatefulClass harder to unit-test, but what's the alternative?
> >
> >     Thanks,
> >     Gili
> >
> >
> >
> > >
>
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
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