Я использую Google Guice для внедрения зависимостей. Предположим, у меня есть следующее:
public interface Payment {
public void pay();
}
public class PaymentCardImpl implements Payment {
public void pay() {
System.out.println("I pay with a card");
}
}
public class PaymentCashImpl implements Payment {
public void pay() {
System.out.println("I pay cash");
}
}
public class Order {
private Payment payment;
@Inject
public Order(Payment payment){
this.payment=payment;
}
public void finishOrder(){
this.payment.pay();
}
}
Далее следует очень простой модуль для привязки, например:
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Payment.class).to(PaymentCashImpl.class);
}
}
Как видите, экземпляр Payment
вводится в конструктор Order. Это сделано в классе MyModule
, и в целом это действительно здорово.
Мой основной выглядит так:
public static void main(String[] args) {
MyModule module = new MyModule();
Injector injector = Guice.createInjector(module);
Order order = injector.getInstance(Order.class);
order.finishOrder();
}
Однако я не вижу, как я мог бы включить какой-то способ условного связывания либо PaymentCardImpl
или экземпляр PaymentCashImpl
для конструктора Order
.
Предположим, например, что заказ был онлайн-заказом. Тогда мне понадобится следующее:
bind(Payment.class).to(PaymentCardImpl.class);
Как лучше всего это сделать? Я новичок в внедрении зависимостей.