впрыскивание без инжектора - PullRequest
0 голосов
/ 08 мая 2019

Ниже приведен мой класс модуля

public class ABCModule extends AbstractModule {

    @Override
    protected void configure() {
        install(new JpaPersistModule(Configuration.get("error-persister")));
        bind(DBService.class).to(DBServiceImpl.class).in(Singleton.class);
        bind(DBRepository.class).to(DBRepositoryImpl.class).in(Singleton.class);
    }

    @ProvidesIntoOptional(ProvidesIntoOptional.Type.ACTUAL)
    public ErrorHandler getErrorHandler() {
        return new ABCHandler();
    }
}

, и ABCHandler имеет

private final DBService dbService;

@Inject
public ABCHandler() {
    Injector injector = Guice.createInjector(new ABCModule());
    injector.getInstance(PersistenceInitializer.class);
    this.dbService = injector.getInstance(DBService.class);
}

@Override
public void handle() {
    dbService.store("abc");
}

ABCModule экземпляр, который создается и передается в какой-то универсальный модуль.Как видите, ABCModule обеспечивает ABCHandler, а ABCHandler снова использует ABCModule для создания инжектора и экземпляра службы.Это работает, но я знаю, что это не правильно.Module вызывается дважды.Как ввести dbService внутрь ABCHandler без использования инжектора или создания экземпляра модуля.Я не хочу создавать пустой модуль для создания экземпляров.не могли бы вы предложить.Если я просто использую @Inject на dbService без использования инжектора, это будет равно нулю.Я использую Provider внутри Module, может нечто подобное сделано для dbService.Или какие-то другие решения?

1 Ответ

2 голосов
/ 08 мая 2019

DbService уже вводится, и вы можете передать его в getErrorHandler метод

  @ProvidesIntoOptional(ProvidesIntoOptional.Type.ACTUAL)
  public ErrorHandler getErrorHandler(DBService dbService) {
    return new ABCHandler(dbService);
  }

В этом случае ABCHandler конструктор может быть изменен на

  @Inject
  public ABCHandler(DBService dbService) {
    this.dbService = dbService;
  }

Подробнее вы можете найти здесь Доступ к инжектору Guice в его модуле?

...