2015-02-09 7 views
4

Я пришел из мира guice и ищу способ сделать что-то похожее на Modules.override, предоставленное Guice. У меня есть шаблон, где я создаю базовый модуль/AbstractBinder для моего производства, а затем в тесте я переопределяю привязки, которые нужно изменить.HK2 Каков правильный способ переопределения привязок другого AbstractBinder

В идеальном мире я хотел бы просто расширить родительский AbstractBinder, а затем реализовать привязки для переопределения родительского связующего. Или другая альтернатива - просто установить родительский Binder и затем переопределить привязки, которые я хочу для целей тестирования.

public class IOCRestModule extends AbstractBinder { 

    @Override 
    protected void configure() { 
     // Max timeout for rest calls is 20 seconds, this will come from properties later on. 
     bind(20000).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT"); 
     bind("tcp://localhost").to(String.class).named("jms.url"); 
    } 
} 

public class IOCMockRestModule extends AbstractBinder { 

    public static final Logger logger = Logger.getLogger(IOCMockRestModule.class.getName()); 

    @Override 
    protected void configure() { 
     install(new IOCRestModule()); 
     bind(200).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT"); 
     bind("vm://localhost").to(String.class).named("jms.url"); 

} 

Возможно ли это, и рекомендуется ли это? Я заметил, что когда я сделал это, привязки для IOCRestModule не были переопределены модулем IOCMockRestModule. Я предполагаю, что я мог бы добавить установку в конце, и это может сработать, но не уверен, что это приведет к дальнейшим проблемам.

ответ

0

В hk2 вы можете иметь несколько привязок для одной и той же вещи. По умолчанию самый старый будет иметь приоритет, но вы можете изменить его, используя ранг. Так что я думаю, что следующий код будет изменить порядок вокруг:

@Override 
protected void configure() { 
    install(new IOCRestModule()); 
    bind(200).to(Integer.class).named("MAX_REST_REQUEST_TIMEOUT").ranked(10); 
    bind("vm://localhost").to(String.class).named("jms.url").ranked(10); 
} 

Это по существу дает это связывание более высокого ранга, чем один из IOCRestModule, и которые затем будут использоваться в пунктах Injection первой. Вы должны заметить, что если кто-то ищет список Integer с именем MAX_REST_REQUEST_TIMEOUT, он получит два из них:

+0

Также перемещение установки после того, как ваши другие связки будут работать из-за правила, в котором старейшая привязка будет выбрана, если они имеют равный ранг – jwells131313