我有一个具有默认实现和特定于客户端的实现的接口。
接口:
@ImplementedBy(CoreServiceImpl.class)
interface CoreService {
// Methods
}
默认实施:
class CoreServiceImpl implements CoreService {
// Methods
}
在我的特定Guice模块中,我使用了不同的实现:
模块:
...
bind(CoreService.class).to(ClientSpecificServiceImpl.class);
...
实现:
class ClientSpecificServiceImpl implements CoreService {
// Methods
}
但是,在这个类中,我需要一个默认实现的实例。
如何告诉Guice“注入此接口的默认实现的实例”?
我可以按类型名称引用当前默认实现,例如
class ClientSpecificServiceImpl implements CoreService {
private final CoreServiceImpl coreServiceImpl;
@Inject
ClientSpecificServiceImpl(CoreServiceImpl coreServiceImpl) {
this.coreServiceImpl = coreServiceImpl;
}
}
..但如果默认实现(@ImplementedBy
内部的那个)发生了变化,我就不会接受更改。这应该通过反思来完成吗?还有更好的方法吗?
答案 0 :(得分:3)
如果要在不同位置注入不同的实现,请使用注入注释。换句话说,对于一个客户:
class ClientSpecificApp {
private final CoreService coreService;
@Inject
ClientSpecificServiceImpl(@Named("clientName") CoreService coreService) {
this.coreService = coreService;
}
}
对于其他人:
class DefaultApp {
private final CoreService coreService;
@Inject
DefaultApp(CoreService coreService) {
this.coreService = coreService;
}
}
然后,在Guice模块中绑定该注释:
protected void configure() {
bind(CoreService.class).annotatedWith(Names.named("clientName") CoreService);
}
然后,您需要做的就是更改模块中针对特定于客户端的版本的绑定(如果它发生更改)。
进一步阅读:Binding Annotations