2013-10-24 4 views
0

Так что я пытаюсь расширить Guice с некоторыми примечаниями на моем довольно много после большой статьи я нашел здесь: http://developer.vz.net/2012/02/08/extending-guice-2/Расширения Guice - guicy путь

Это работает очень хорошо для меня, кроме вещи:

Теперь в моем модуле я один экземпляр из этих сервисов:

final SchedulerService schedulerService = new SchedulerService(); 

А вот скрытое зло. Этот парень был достаточно удачлив, ему нужен простой объект без каких-либо зависимостей. Но в моем случае моим Service нужна ссылка на еще две под-услуги. И так как он использовал new для создания Service, мне нужно использовать new для обоих подсервисов, поэтому я смогу его создать. Поэтому я не могу вводить некоторые свойства в эти подсервисы. Фактически я создаю цельное объектное поддерево, которое не определено.

Есть ли способ вокруг него? Могу ли я позволить Guice создать экземпляр Service для меня, а затем зарегистрировать его в TypeListener?

ответ

2

Вы действительно можете получить доступ к поставщикам инжектированных элементов внутри модуля с использованием getProvider (на Binder и AbstractModule), до тех пор, как вы обещаете не не называть get только после Injector существует. (Вы get an IllegalStateException, если вы делаете.)

В этот момент ваш код выглядит примерно так:

Provider<YourService> yourServiceProvider = getProvider(YourService.class); 
final InjectionListener injectionListener = new InjectionListener() { 
    public void afterInjection(Object injectee) { 
    yourServiceProvider().get().accept(injectee); 
    } 
} 

Единственная проблема в том, что инъекционный вашу службу и его зависимость, вероятно, также попытаться вызвать ваш InjectionListener, вероятно, вызывает бесконечный цикл. Вы можете решить это, добавив нулевой защитник и игнорируя все инъекции, пока ваша служба равна нулю. Ваша лучшая ставка, хотя, может быть, чтобы создать инжектор без слушателя используется при загрузке YourService, и добавить слушателя в ребенка инжектора:

Injector injectorWithoutListener = Guice.createInjector(new YourServiceModule()); 
YourService yourService = injectorWithoutListener.getInstance(YourService.class); 
Injector finalInjector = injectorWithoutListener.createChildInjector(
    new YourInjectionListenerModule(yourService), new EverythingElseModule()); 

Обратите внимание, что объекты с одноплодной поведения, сконфигурированной в родительском инжектора по-прежнему будет создан там, поэтому экземпляры, созданные в finalInjector, будут делиться однопользовательским поведением с экземплярами в injectorWithoutListener. Вы также можете узнать больше о createChildInjector и binding resolution order.

+0

Большое спасибо за усилия. Actaully Я столкнулся с той же мыслью, когда думал об этом позже вчера. Лучшим был бы новый модуль с отдельным инжектором. Я не знал о «childInjector», хотя это делает его понятным и чистым. Будем стараться и соглашаться скоро с надеждой! –

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