2016-04-06 5 views
2

Я использую guice для инъекций зависимостей.Как использовать гик-инжектор в качестве провайдера?

У меня есть этот провайдер:

public class RequestUrlRepository implements Provider<IRequestUrlRepository> { 


    @Singleton 
    @Override 
    public IRequestUrlRepository get() { 
     IRequestUrlRepository answer = null; 
     if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){ 
      answer = new CostRequestUrlRepository(...); 
     } 
     else 
     { 
      answer = new RoutingRequestUrlRepository(...); 
     } 
      return answer; 
    } 
} 

, как я могу использовать Guice инжектор для заполнения new CostRequestUrlRepository(...); и new RoutingRequestUrlRepository(...), когда он в поставщика?

Если это невозможно, как можно инициализировать их без ручного создания всех параметров ctor?

ответ

3

Провайдеры могут принимать @Inject -annotated конструкторов и полей, а также встроенные в переплетах Guice будут препятствовать вам вводить как Injector и поставщик для любого ключа инжектор может обеспечить (например, Provider<CostRequestUrlRepository>).

@Singleton 
public class RequestUrlRepository implements Provider<IRequestUrlRepository> { 

    @Inject Provider<CostRequestUrlRepository> costRepositoryProvider; 
    @Inject Provider<RoutingRequestUrlRepository> routingRepositoryProvider; 
    @Inject Injector injector; 

    @Override public IRequestUrlRepository get() { 
     IRequestUrlRepository answer = null; 
     if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){ 
      return costRepositoryProvider.get(); 
     } else { 
      return routingRepositoryProvider.get(); 
     } 

     // Alternatively: 
     return injector.getInstance(Class.forName(System.getProperty(""))); 
    } 
} 

Обратите внимание, что @Singleton аннотацию идет на классе, а не метод; в списке рассылки Guice. Аннотации Scope применяются к поставщикам в целом, аннотирование метода get() с @Singleton ошибочно и игнорируется ». (link).

В идеале, вместо инъекции всего инжектора, вы должны вводить каждого поставщика; это должно облегчить просмотр зависимостей вашей системы, а затем вы больше полагаетесь на Guice и больше на общие аннотации JSR330. Однако, если вам нужно создать экземпляр произвольного класса на основе имени или литерала класса в переменной, то инъекция инжектора - это путь.

+0

Я собираюсь инициализировать 'costRepository' и' routingRepository' для заполнения интерфейса 'IRequestUrlRepository'. Я не думаю, что я должен писать провайдеру для каждого из них. –

+0

Для любой привязки к 'X',' Provider 'или' @Provides X', Guice автоматически создаст Провайдера или вызовет 'provider.get()' автоматически , Нет необходимости писать свои собственные Провайдеры для репозиториев. –

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

  • Нет связанных вопросов^_^