【发布时间】:2015-06-18 18:27:11
【问题描述】:
这是一个与其他已回答的关于构造函数参数的问题略有不同的问题(或者至少我是这么认为的,当然我可能错了)。所以我使用 MapBinder 来存储一堆实现,然后在运行时根据一些标准选择一个。这是一些代码:
public interface MessageService {
void send();
}
public class FacebookMessageService implements MessageService {
private final String name;
@Inject
public FacebookMessageService(String name) {
this.name = name;
}
public void send() {
System.out.println("Sending message via facebook service to " + name);
}
}
public class MessageModule extends AbstractModule {
@Override
protected void configure() {
MapBinder<String, MessageService> mapBinder = MapBinder.newMapBinder<.....>
mapBinder.addBinding("facebook").to(FacebookMessageService.class);
}
}
public class MessageClient {
@Inject
Map<String, MessageService> map; //Mapbinder being injected
public void callSender() {
Injector injector = Guice.createInjector(new MessageModule());
injector.injectMembers(this);
MessageService service = map.get("facebook");
service.send();
}
}
我无法弄清楚如何使用name 参数获取FacebookMessageService?如果我将AssistedInject 与Factory 一起使用,那么我无法弄清楚如何将实现注入MapBinder。
【问题讨论】:
-
我没用过MapBinder,但是按照this的说法,你应该是自己注入MapBinder,而不是key,这就是你想要的吗?
-
@AlperAkture 我不确定你在这里所说的
key是什么意思,但是mapBinder 正在被注入客户端。上面的代码有效,但我不知道如何注入name参数,所以它基本上打印“通过 facebook 服务发送消息”而没有name -
你能从一个 prop 文件中加载 FacebookMessageService 构造函数参数吗,比如this?
-
这对配置很有意义,但在我的情况下它是一个接口。抱歉,我在那里有一个字符串,但这只是为了简化问题。 :) 我不知道那个配置。谢谢! :)
-
np,也许我没有完全了解您的用例。你想在 FacebookMessageService 构造函数中注入什么?