0
在吉斯,有没有一种方法来选择结合一些外部参数吉斯 - 基于外部参数,动态地选择供应商
如具体的实现:
public interface Service {
void sendMessage()
}
class EmailService implements Service {
public EmailService() { }
@Override
void sendMessage() {
println "Sending email..."
}
}
class SMSService implements Service {
public EmailService() { }
@Override
void sendMessage() {
println "Sending sms..."
}
}
class Client {
private Service service
@Inject
Client(Service service) {
this.service = service
}
public void send() {
service.sendMessage()
}
}
public class ServiceProvider implements Provider<Service> {
Service get() {
return new SMSService() //Select implementation here?
}
}
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Service.class).toProvider(ServiceProvider.class).in(Scopes.SINGLETON)
}
}
public static void main(String...args) {
Injector injector = Guice.createInjector(new MyModule())
Client c = injector.getInstance(Client.class)
c.send()
}
在上面的例子中,我m被迫选择在Provider get()方法中使用哪个提供者。如果我想让这更动态,比如说,根据用户的偏好,是否有一种方法可以在运行时选择提供者,并让guice注入它?
我不会那样做注射。您可以将所有服务注入到客户端,然后定期执行if/else逻辑来选择要使用的服务。否则,您会在注入器上创建一个丑陋的依赖关系。 – zapl
绑定所有的实现似乎是一个好主意。所提及的if-else逻辑的条件可以通过系统属性来传递,例如 – Opal