Thanks for this Eric. I just made a simple ServiceFactory singleton and it
seems to be working great.
public enum ServiceFactory {
INSTANCE;
Injector injector = Guice.createInjector(getModules());
public <T> T getService(Class<T> clz) {
return injector.getInstance(clz);
}
private Collection<Module> getModules() {
HashSet<Module> modules = new HashSet<Module>();
modules.add(new OndpServicesModule());
return modules;
}
}
On Wed, Jan 14, 2009 at 7:32 AM, Eric Anderson <[email protected]>wrote:
> Rick,
>
> The code I posted was... overly simplistic. Yes, creating the injector
> multiple times could be very costly depending on what is getting
> initialized. A more complete solution would use a lazy-loaded injector
> singleton:
>
> import com.google.inject.*;
> import java.util.*;
>
> public class ServiceCreator {
>
> Injector injector;
> private static ServiceCreator INSTANCE = new ServiceCreator();
>
> public static <T> T createService(Class<T> clz) {
> return INSTANCE.getInjector().getInstance(clz);
> }
>
> private Injector getInjector() {
> if (injector == null) {
> injector = Guice.createInjector(getModules());
> }
> return injector;
> }
>
> private Collection<Module> getModules() {
> HashSet<Module> modules = new HashSet<Module>();
>
> //Add modules here
>
> return modules;
> }
> }
>
> This keeps the injector as a field on the ServiceCreator instance. It
> would be easy enough to tweak the code above such that you could have
> clients using the ServiceCreator instance rather than a static method. If
> you're trying to do thorough unit testing, I might be tempted to expose the
> instance of ServiceCreator rather than static methods so that ServiceCreator
> could be put behind an interface.
>
> The main thought was to hide the working of Guice behind a thin facade. I
> personally haven't ever needed to do this since our apps use Guice
> throughout. But, we have had to wrap external dependencies, and this is how
> we've done that (although we do tend to put them behind an interface).
>
> Eric
>
>
> On Tue, Jan 13, 2009 at 3:37 PM, Rick <[email protected]> wrote:
>
>>
>> On Tue, Jan 13, 2009 at 4:03 PM, Eric Anderson
>> <[email protected]> wrote:
>> > You could always expose a thin static wrapper over the injector so that
>> > users don't have to know about the Guice modules or the injector for
>> that
>> > matter. What I might do is this:
>> >
>> >
>> > class ServiceCreator {
>> > public static <T> T getBar(Class<T> clz) {
>> > return Guice.createInjector(modules).getInstance(clz);
>> > }
>> > }
>> >
>> > The clients can decide how they want to consume something like this.
>> I'm
>> > assuming that you're talking about existing applications that are NOT
>> > currently using IoC.
>>
>>
>> Thanks Eric for your reply... in regard to existing applications NOT
>> currently using IoC... I guess that's partially true. Since the jar's
>> main use will be inside of a tibco ESB in a NEW application, I could
>> force them to use Guice.... but I really don't figuring out with them
>> at what part should I hook in to get Guice bootstrapped. I was hoping
>> to keep the Guice I'm using relatively transparent to them.. so for
>> example they would just use the classes provided as singletons or
>> static methods to do the basic dao operations (ie
>> updateEmployee(Employee e).
>>
>> In regard to the code posted above I have to admit I'm a bit confused
>> by how it would be used. I suppose the real implementation would be
>> called getService(Class<T> clz) ?
>>
>> and the end user would have to call something like...
>>
>> EmployeeService service = ServiceCreator.getService(EmployeeService.class)
>> ?
>>
>> If so I'm confused though, wouldn't the end users be calling
>> Guice.createInjector(modules) a bunch of times?
>>
>> There would also be the need to return other Service classes to the
>> end user as well. Or does it not hurt to call createInjector multiple
>> times?
>>
>> Thanks again for the help.
>>
>>
>>
>
> >
>
--
Rick
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---