Just need to be careful of state and provider use if you go with a builder 
pattern.

Another way I've handled this in the past is using dynamic proxies that use the 
method parameters to perform a lookup. In the end, all the solutions I've used 
are the same. There is at least one level of indirection and someone has to 
perform a lookup or build a new instance (i.e. a provider). In the lookup case 
the Injector can be used to perform the lookup. In the provider case I've used 
post-inject after instantiation or pre-injection of the provider.

-bp


On Nov 18, 2009, at 8:23 AM, Gary Pampara wrote:

> Sorry I see now what you mean. Where do you get the information
> regarding the 'type' so that the factory can create the needed
> instance?
> 
> I solved this a while ago in a project using the builder pattern. This
> is a trivial example, but it seems to work. If anyone has a better way
> of doing this, I'd appreciate the advice.
> 
> http://pastie.org/704247
> 
> 
> On Wed, Nov 18, 2009 at 4:38 PM, Sam Berlin <[email protected]> wrote:
>> Will there always be one implementation and only one implementation for the
>> lifetime of the project?  If so, can you decide upon that implementation
>> during runtime before the Injector is created?  If so, include the
>> appropriate module to bind the ServiceImpl you want based on the
>> configuration.  If the impl can change throughout the lifetime (because
>> users can request different types based on the 'type'), then you'll
>> absolutely need some form of indirection (in your code the Factory provides
>> the indirection).  If you're concerned about calling new Service1 & new
>> Service2, you can use BindingAnnotations to actually bind both kinds of
>> Services, the Factory can have both Services injected and then hand out the
>> appropriate service based on the 'type'.
>> 
>> Sam
>> 
>> On Wed, Nov 18, 2009 at 12:02 AM, Ryan <[email protected]> wrote:
>>> 
>>> Hello everyone,
>>> 
>>> I'm new to Guice (really enjoying it, by the way), but have come up
>>> against a need and I'm not sure the most Guice-appropriate way to do
>>> it.  Done a lot of searching (including in this group), but am not
>>> sure I found the solution.  (Or perhaps I just didn't understand it.)
>>> In any case, my question is how to select an implementation based on
>>> some runtime value.  For reference, a standard factory solution would
>>> look like:
>>> 
>>> class ServiceFactory {
>>>  public static Service get(int type) {
>>>     if(type == 1) { return new ServiceImpl1(); }
>>>     else if (type == 2) { return new ServiceImpl2(); }
>>>  }
>>> }
>>> 
>>> class Client {
>>>   public void process(int type) {
>>>      Service service = ServiceFactory.get(type);
>>>   }
>>> }
>>> 
>>> Feels too service locator-y.  But I can think of no way to do this in
>>> Guice except to inject the factory:
>>> 
>>> class Client {
>>>        @Inject
>>>        ServiceFactory factory;
>>> 
>>>        public void process(int type) {
>>>                Service service = factory.get(type);
>>>        }
>>> }
>>> 
>>> class ServiceFactoryProvider implements Provider<ServiceFactory> {
>>>        @Override
>>>        public ServiceFactory get() {
>>>                return new ServiceFactory();
>>>        }
>>> }
>>> 
>>> class MyModule extends AbstractModule {
>>>        @Override
>>>        protected void configure() {
>>>                bind(Client.class);
>>>        }
>>> }
>>> 
>>> What am I missing here?  What's the proper way to implement this with
>>> Guice?  I don't think BindingAnnotations will work for me here,
>>> because the implementation is decided upon at runtime, but feel free
>>> to correct me.
>>> 
>>> Thank you!
>>> Ryan
>>> 
>>> --
>>> 
>>> 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=.
>>> 
>>> 
>> 
>> --
>> 
>> 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=.
>> 
> 
> --
> 
> 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=.
> 
> 

--

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=.


Reply via email to