Or not, maybe the assisted inject extension is the wrong way to go
about this.  Hopefully someone who understands guice better than I do
can clarify for me.

(I'm using Guice 3.0 btw)

I have an interface, MyInterface and two concrete implementations
ImplementationA and ImplementationB and a factory interface
MyInterfaceFactory for creating implementations of MyInterface.  I
also have two annotations, @StyleA and @StyleB which correspond
roughly to the two implementations.

I'd like to have a class created by Guice that has two members like
so:

@Inject @StyleA private MyInterface interfaceTypeA;
@Inject @StyleB private MyInterface interfaceTypeB;

This class is also a factory and contains the logic to determine
whether or not A or B is more suitable for the thing it happens to be
creating.

I was reading about the AssistedInject stuff and I thought I could do
something like:

install(new FactoryModuleBuilder()
                        .implement(MyInterface.class, StyleA.class, 
ImplementationA.class)
                        .implement(MyInterface.class, StyleB.class, 
ImplementationB.class)
                        .build(MyInterfaceFactory.class));

But at runtime i get guice errors telling me there's no implementation
of MyInterfaceFactory annotated with @StyleA (or @StyleB) bound when
I'm trying to get values injected into the aforementioned fields.  It
also tells me that MyInterface is an interface, not a concrete class,
which is true, and that it's unable to create an AssistedInject
factory.

I thought the above use of FactoryModuleBuilder was equivalent to
having done:

bind(MyInterfaceFactory.class).annotatedWith(StyleA.class).toProvider(FactoryProvider.newFactory(MyInterfaceFactory.class,
ImplementationA.class));
bind(MyInterfaceFactory.class).annotatedWith(StyleB.class).toProvider(FactoryProvider.newFactory(MyInterfaceFactory.class,
ImplementationB.class));

Maybe it is, maybe it isn't.  I'm going to try that next, but I see
that FactoryProvider is deprecated, and I'd rather not rely on it if
there is a more appropriate way to make this happen.

Am I misunderstanding how these are to be used and/or using them
incorrectly?  Is there a better way to accomplish this?

Thanks for any help.

Mike

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