I would do the "class" solution in a more OO way (eliminate the "switch"):
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(GenericExecutorProvider.class)
.annotatedWith(Names.named("single"))
.to(SingleProvider.class);
bind(GenericExecutorProvider.class)
.annotatedWith(Names.named("pool"))
.to(PoolProvider.class);
}
}
abstract class GenericExecutorProvider implements Provider<ExecutorService>
{
public abstract ExecutorService get();
}
class SingleProvider extends GenericExecutorProvider {
@Inject
SingleProvider(final SomeDependency d) { }
public ExecutorService get() {
// construct and return an ExecutorService
// based on SomeDependency
return null;
}
}
class PoolProvider extends GenericExecutorProvider {
@Inject
PoolProvider(final AnotherDependency d) { }
public ExecutorService get() {
// construct and return an ExecutorService
// based on AnotherDependency
return null;
}
}
2011/3/9 Sam Berlin <[email protected]>
> You can have one provider for both bindings, but the provider can't
> disambiguate based on what it's providing (that is, there's know of knowing
> the thing it's providing for).
>
> You could do this with less code with @Provides methods (or also simulate
> it if you're stuck with classes). For example:
>
> @Provides @Named("single") ExecutorService provideSingle(AnotherDependency
> ad) {
> return makeExecutor(ad, Type.SINGLE);
> }
>
> @Provides @Named("pool") ExecutorService providePool(AnotherDependency ad)
> {
> return makeExecutor(ad, Type.POOL);
> }
>
> private ExecutorService makeExecutor(AnotherDependency ad, Type type) {
> ... }
>
> --- or, using classes ---
>
> class SingleProvider extends GenericExecutorProvider {
> SingleProvider() { super(Type.SINGLE); }
> }
>
> class PoolProvider extends GenericExecutorProvider {
> PoolProvider() { super(Type.POOL); }
> }
>
> class GenericExecutorProvider implmenets Provider<ExecutorService> {
> final Type type;
> GenericExecutorProvider(Type type) { this.type = type; }
>
> @Inject injectDependency(AnotherDependency ad) { .... }
>
> ExecutorService get() {
> switch(type) { ... }
> }
> }
>
>
> sam
>
> 2011/3/9 Bahri Gençsoy <[email protected]>
>
>
>> Hi, I am trying to achieve some binding with Guice 2.0. I did search the
>> mailing list but couldn't find a similar problem/solution.
>>
>> I am trying to bind different implementations of same interface. I want to
>> discriminate them against their annotations.
>>
>> These are my classes to be injected dependencies to, I do not want to
>> change them a lot:
>>
>> class SingleRunner {
>> @Inject
>> public void setExecutor(@Named("single") ExecutorService executor) {
>> // ...
>> }
>> }
>>
>> class PoolRunner {
>> @Inject
>> public void setExecutor(@Named("pool") ExecutorService executor) {
>> // ...
>> }
>> }
>>
>> This is the traditional approach to bind providers for these classes;
>> creating to provider classes and bind them:
>>
>> class SingleProvider implements Provider<ExecutorService> {
>> @Inject
>> private SomeOtherDependency other;
>>
>> public ExecutorService get() {
>> return singleExecutorService;
>> }
>>
>> }
>>
>> class PoolProvider implements Provider<ExecutorService> {
>> @Inject
>> private SomeOtherDependency other;
>>
>> public ExecutorService get() {
>> return poolExecutorService;
>> }
>>
>> }
>>
>> class MyModule extends AbstractModule {
>> @Override
>> protected void configure() {
>>
>> bind(ExecutorService.class).annotatedWith(Names.named("pool")).toProvider(PoolProvider.class);
>>
>> bind(ExecutorService.class).annotatedWith(Names.named("single")).toProvider(SingleProvider.class);
>> }
>> }
>>
>> But I am not comfortable with creating two provider classes. I want one
>> provider class to provide all instances, ie something like that:
>>
>> class AllExecutorProvider {
>> @Inject
>> public void setSomeOtherDependency(SomeOtherdependency dep) {
>> // ...
>> }
>>
>> public ExecutorService getExecutor(String name) {
>> if (name.equals("pool")) {
>> return poolExecutor;
>> } else if (name.equals("single")) {
>> return singleExecutor;
>> } else {
>> return null;
>> }
>> }
>> }
>>
>>
>> Thanks in advance
>>
>>
>> --
>> 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.
>>
>
> --
> 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.
>
--
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.