2016-02-11 2 views
1

У меня есть класс (CustomConnectionProvider), который будет создан библиотекой сторонних разработчиков (спящий режим) с использованием class.forName().newInstance(). Мне нужно ввести управляемую зависимостью, указанную MyDatabaseFactory, которая предоставит источники данных для многопользовательской аренды.Inject guice dependency в классе non guice

Я не могу напрямую @Inject MyDatabaseFactory, потому что CustomConnectionProvider не управляемый компонент. И я не могу контролировать, как он создается.

Я только начал с Guice как часть приложения Play. Любые примеры или идеи будут оценены, я ищу решение, такое как ServiceLocator.

Fixed для конкретного случая К счастью, Play.application() предоставляет статический метод для получения injector, и я использую его, чтобы получить экземпляр моей фабрики. Я все еще хочу знать, должен ли я исправить это без игры.

Обновление для игры 2.5 Play.application() осуждается в 2.5. Предлагаем использовать статическую инъекцию.

+0

Эй, это спящий режим? Если это так, существует: https://github.com/google/guice/wiki/GuicePersist, который является моделью guice для спящего режима. Если вам нужно сделать это вручную, вы должны создать entitymanager (hibernate stuffs) в модуле, где вы создаете все остальное. Таким образом, вы получите постоянную настойчивость в управлении. У меня есть пример для моего дела на последнем, но я не использую Play – pandaadb

+0

@pandaadb, это не относится к Hibernate. Он специфичен для ввода объекта в другой класс, который вообще не инициализируется Guice, а инициализация этого класса находится в некоторой библиотеке третьей стороны. –

ответ

1

Вы можете использовать статическую инъекцию. См. https://github.com/google/guice/wiki/Injections

Это позволяет объектам частично участвовать в инъекции зависимостей, получая доступ к инъецированным типам, не будучи введенными сами. Используйте

requestStaticInjection()  

в модуле указать классы для инъекций во время Инжектор-создания:

@Override public void configure() { 
requestStaticInjection(ProcessorFactory.class); ... } 

Guice будет вводить статические члены класса, которые имеют пометку @Inject.

+0

Ссылка только ответы должны содержать соответствующие части страницы, включенные в ваш ответ, можете ли вы добавить какой-то контекст? – tddmonkey

+0

Похоже, что это путь к достижению, я попытаюсь посмотреть, смогу ли я это сделать. –

+1

Я пробовал это и его работу. Благодаря! –

1

На самом деле, requestStaticInjection не рекомендуется. Как объясняет this link (This API is not recommended for general use because it suffers many of the same problems as static factories: it's clumsy to test, it makes dependencies opaque, and it relies on global state.), это создает множество проблем при немногих обстоятельствах. Поведение несовместимо, и инъекция не проходит успешно.

мне пришлось взять несколько иной подход: Мой случай немного сложнее, экземпляр моего класса будет создан Hibernate с помощью Class.forName(), это может быть еще один случай, когда статические инъекции может неудачу.

Мне пришлось создать фабрику Singleton, которая будет инициализирована и привязана к инжектору Guice в начале создания модуля, эта фабрика будет содержать фактический компонент, который мне нужно ввести в мой фактический класс. Он предоставляет статический метод для получения требуемого компонента.

public Class RequiredBeanFactory { 
     private static RequiredBean bean; 
     //note this is a package private 
     RequiredBeanFactory(RequiredBean bean) { 
      this.bean = bean; 
     } 

     public static RequiredBean getBean() { 
      return bean; 
     } 
    } 

В моем модуле я инициализирую его и привязываю.

public class MyModule extends AbstractModule { 
    private final RequiredBean bean; 

    @Inject 
    public MyModule(RequiredBean bean) { 
     this.bean = bean; 
    } 

    protected void configure() { 
     RequiredBeanFactory factory = new RequiredBeanFactory(this.bean); 
     bind(RequireBeanFactory.class).toInstance(factory); 
    } 
} 

В моем классе HibernateCustom, я просто использую RequiredBeanFactory.getBean().

Это своего рода хак, может иметь те же побочные эффекты, что и упомянутый Guice, но он находится под моим контролем, и поведение последовательное.

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