The provider interface doesn't allow you to inspect the request and  
you would still need a lazy proxy from the provider. Whenever you need  
to interrogate the request to determine injection, I'd use a proxy and  
dynamic lookup.

-bp



On Aug 13, 2009, at 7:33 PM, zhaoyi wrote:

>
> Can't I use provider to do this? If I use factory pattern, I only need
> one factory class. However, If I use guice, I have to create one
> factory class, one Module class and one provider class. I think guice
> will make our application more complicated.
>
>
> On Aug 10, 3:00 pm, Brian Pontarelli <[email protected]> wrote:
>> This pattern was common at Orbitz, although more complex. The idea  
>> was
>> that you wanted to use a service for booking airline tickets. You
>> would ask the factory for an implementation of the AirBookingService
>> for UA or AA or NWA. Each implementation would talk to the specific
>> airline and talk their special on-the-wire language.
>>
>> We did this in a pretty cool way when we converted to Spring many
>> years back by using a proxy service that would lazy load the real
>> service after calling a lookup based on the request. Looked like  
>> this:
>>
>> public class Caller {
>>    private AirBookingService service; // injected as a dynamic proxy
>>
>>    public String doBooking() {
>>      AirBookingRequest request = ...;
>>      service.book(request);
>>    }
>>
>> }
>>
>> public class AirBookingServiceHandler implements InvocationHandler {
>>    private AirLookupService lookup; // injected
>>
>>    public Object invoke(Object proxy, Object instance, Object..
>> params) {
>>      AirBookingRequest request = (AirBookingRequest) params[0];
>>      BookingService service =
>> lookup.lookupService(request.getAirlineCode());
>>      return service.book(request);
>>    }
>>
>> }
>>
>> That's the general gist of it anyways. The invocation handler was
>> actually generic enough to handle all services and pass calls from  
>> the
>> proxy to the correct service implementation. This allowed everything
>> to be injected without having to inject factories everywhere.
>>
>> -bp
>>
>> On Aug 9, 2009, at 3:07 PM, [email protected] wrote:
>>
>>
>>
>>> Hey there,
>>
>>> Generally you wouldn't use a factory in this way - the idea is that
>>> the caller just expects any implementation of the interface returned
>>> therefore the caller specifying the implementation to use doesn't  
>>> make
>>> sense.
>>
>>> Out of interest, how are you using this particular piece of code?
>>
>>> Cheers
>>
>>> Mark
>>
>>> On Aug 9, 3:04 pm, zhao yi <[email protected]> wrote:
>>>> This is my code based on Factory pattern. I want to use guice and  
>>>> how
>>>> can I convert it to use guice?
>>
>>>> interface Interface1{
>>>>         public void sayHello();
>>
>>>> }
>>
>>>> class Imple1 implements Interface1{
>>>>         @Override
>>>>         public void sayHello() {
>>>>                 System.out.println("imple 1");
>>>>         }
>>
>>>> }
>>
>>>> class Imple2 implements Interface1{
>>>>         @Override
>>>>         public void sayHello() {
>>>>                 System.out.println("imple 2");
>>>>         }
>>
>>>> }
>>
>>>> class Factory{
>>>>         public Interface1 getInterface(int type){
>>>>                 if(type == 1){
>>>>                         return new Imple1();
>>>>                 }else if(type ==2){
>>>>                         return new Imple2();
>>>>                 }
>>>>                 return null;
>>>>         }
>>
>>>> }
>>
>>>> thanks.
> >


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