2014-12-16 4 views
1

Я хочу создать глобальное состояние (объект данных, а не объект службы).Как реализовать глобальное состояние с помощью guice?

Я создал класс MyDataObject.

Я хочу, чтобы избежать регулярного глобального состояния,

но предпочитают использовать инъекции Guice зависимостей.

Однако все учебные пособия показывают, как установить DI для служебного объекта с регистрацией для интерфейса.

Как я могу использовать инъекцию Guice для моей потребности?

Редактировать

Я попытался:

общественного класса AppInjector расширяет AbstractModule {

@Override 
protected void configure() { 
    bind(E2eResult.class).toInstance(new E2eResult()); 
} 

}

с:

@Test 
    public void sendSearchRequest() throws Exception { 

... 
e2eResult = injector.getInstance(E2eResult.class); 

     timerUtils.setTimeOut(criticalBlockTimeOutMilli); 
     timerUtils.startStopWatch(); 

... 

     long timeElapsed = timerUtils.stopStopWatch(); 
     e2eResult.runTime = timeElapsed; 


... 
    } 

и:

public static void main(String... args) throws ClassNotFoundException, IOException { 

     Injector injector = Guice.createInjector(new AppInjector()); 
     Result result = runTest(classAndMethod); 
     E2eResult e2eResult = injector.getInstance(E2eResult.class); 
} 

и все же я видел в main был без новой долгосрочной стоимости.

+0

Я не думаю, что я действительно понимаю ваш вопрос ... Сделайте привязку [привязка экземпляра] (https://github.com/google/guice/wiki/InstanceBindings) или [singleton] (https://github.com/google/guice/wi ki/Scopes) могут вам помочь? – NiziL

+0

Нет, поскольку он связан с привязкой конкретных классов к интерфейсу. здесь: '@Singleton Открытый класс InMemoryTransactionLog реализует TransactionLog {' my dataObject не реализует никакого интерфейса. –

+0

Не обязательно, см. Мой ответ – NiziL

ответ

4

Чтобы придать класс GlobalState вы должны сначала создать экземпляр этого (установить его, как вам нравится), а затем привязать класс к примеру:

bind(GlobalState.class) 
    .toInstance(globalState); 

GlobalState могут быть созданы и настроены в вашем «модуль», вы можете прочитать об этом подробнее здесь:

https://github.com/google/guice/wiki/GettingStarted

+0

и где я могу инициировать 'globalState' хотя? –

+0

см. Мое обновление –

+0

Испытание и основные два процесса. Кроме того, нехорошо делить состояние с тестом на приложение. Зачем вам нужно? – manzur

1

Так у вас есть простой объект старый Java GlobalState:

public class GlobalState { 
    // whatever... 
} 

Вы можете использовать механизм одноплодной предоставленный Guice:

bind(GlobalState.class).in(Singleton.class); 

Или использовать связывание экземпляра:

bind(GlobalState.class).toInstance(new GlobalState()); 

Таким образом, вы будете иметь возможность вводить уникальный экземпляр GlobalState в ваше приложение.

+0

Я попытался, но 'new GlobalState()' в 'bind (GlobalState.class) .toInstance (new GlobalState());' каждый раз создавал новый экземпляр. Нет? –

+0

@ user1065869 Я так не думаю, вики wiki говорят: «Вы можете привязать тип к конкретному экземпляру этого типа» и «Избегайте использования .toInstance с объектами, которые сложно создать, поскольку это может замедлить запуск приложения ». Поэтому я предполагаю, что он свяжет уникальный экземпляр с именем «GlobalState.class». – NiziL

+0

см. Мое обновление –

0

я в конце концов создать «старую» плохую одноплодную

Нет необходимости в специальном связывании

, потому что я не имел какой-либо предварительно загруженный объекта.

@Override 
protected void configure() { 
} 

просто носить один и только Guice инжектор

public class InjectorSingleton { 

    public Injector guiceInjector; 
    private static InjectorSingleton singleton; 

    private InjectorSingleton() { 
     guiceInjector = Guice.createInjector(new AppInjector()); 
    } 

    public static InjectorSingleton getInstance() { 
     if (singleton == null) { 
      singleton = new InjectorSingleton(); 
     } 

     return singleton; 
    } 

} 

и я называю это от моего main class и от моего test class

InjectorSingleton.getInstance().guiceInjector.getInstance(MyDataObject.class);

Смежные вопросы