Внедрение зависимостей на основе условия

Я использую 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);

Как лучше всего это сделать? Я новичок в внедрении зависимостей.

9
задан Joeblackdev 6 August 2011 в 17:34
поделиться