2013-09-12 2 views
0

Я пытаюсь изучить инъекцию зависимостей с помощью кинжала.Кинжал: как создать экземпляр разных объектов ObjectGraphs в зависимости от сборки

Я понимаю, что в ваших классах, вы не непосредственно экземпляр объекта код клиента зависит, но объявить его @Inject, создать ObjectGraphs через модуль, и получить объект из ObjectGraph:

@Inject CoffeeMaker coffeeMaker; 

    public static void main(String[] args) { 
    ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule()); 
    CoffeeApp coffeeApp = objectGraph.get(CoffeeApp.class); 
    .... 
    } 

Однако этот код теперь зависит от модуля, который вы используете для создания ObjectGraph (DripCoffeeModule, в этом примере).

Теперь я хочу использовать это в своем приложении для Android. Для сборки отладки я хочу определенную реализацию моих классов, для сборки релиза реализация будет отличаться.

Как я должен это делать? Как настроить скрипт build.xml ant, чтобы модуль поставлял конкретные реализации, которые я хочу? (или выбрать правильный модуль) ...

Спасибо.

+0

В чем проблема, которую вы пытаетесь решить с помощью условной проводки? Почему вы хотите, чтобы разные компоненты отлаживались, а не отлаживались. –

+0

Ну, на самом деле релиз отладки vs был упрощением, которое упростило задачу. Моя реальная проблема - сборка GooglePlay и сборка Amazon, в которой используются различные версии биллингового модуля InApp. То, как я делаю это сейчас (без кинжала), записывает в build-time (используя ant) ​​конкретное значение в конфиге.файл свойств. Это значение считывается во время выполнения и используется как вход фабрики BillingModule. Я подумал, что я мог бы решить эту проблему с помощью кинжала более элегантным способом, без необходимости фабрики. – GaRRaPeTa

ответ

2

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

Вы можете выполнить условную проводку тремя способами, используя только кинжал (без сбоев с системами сборки).

  1. Создайте модуль верхнего уровня для каждого набора конфигураций, которые включают в себя все более конкретные модули, которые обеспечивают определенные реализации - один для тестирования, один для этой биллинговой структуры, один для этого. Включите все модули верхнего уровня времени выполнения в файл Dex для производства и выберите между ними во время настройки графика.

  2. Создайте метод @Provides для данного компонента, который принимает все потенциальные реализации в своих зависимостях и переключается между ними при условии времени на основе условий.

    1. Как и в случае с # 2, но метод @Provides зависит от Lazy, поэтому создание зависимых компонентов происходит только с компонентом, фактически выбранным во время обеспечения, а другой компонент никогда не создается.
  3. Создайте реализацию обертки данного компонента, который принимает другие возможные реализации как зависимость, а компонент делегирует соответствующее значение во время выполнения.

Я склонен рекомендовать # 1, как вы очень узко построения электропроводку каждого случая, и вы не загружаете адаптеры для модулей и классов, которые не входят в число Hte выбранных модулей. # 2.1 - мой второй выбор, потому что, в отличие от # 2, он минимально выделяет. Другие действительно делают вещи довольно продолжительными и тяжелыми, а также приводят к расточительной загрузке классов и созданию/распределению.