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