Sorry, you're right. I left out some details-- for instance, I didn't have static factory methods really. Instead, I had a builder which built up a list of modules as you called methods to configure it. When you called its build() method it created an Injector with the configured list of modules and then called injector.getInstance() to return an instance of the main API interface. That interface was in part a factory which wrapped a few Providers. Hope this helps.
On Tue, Sep 15, 2009 at 10:38 AM, Gili Tzabari <[email protected]>wrote: > > Hi, > > Okay, but who injects the factories in the first place? I was under > the > impression that users invoke: > > public static Stateless SomeFactory.getStateless(); > > I assume you had something else in mind? > > Gili > > Logan Johnson wrote: > > > > 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] > > <mailto:[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]> > > > <mailto:[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 -~----------~----~----~----~------~----~------~--~---
