2013-11-30 4 views

ответ

12

Чтобы начать, я являюсь основным автором Transfuse, поэтому этот ответ может быть немного наклонен в этом направлении.

Как переливание, так и рукоятка кинжала Зависимость впрыска/инверсия управления для Android аналогичным образом. Оба используют обработку аннотации во время компиляции с помощью JSR269 для генерации кода, поддерживающего функциональность DI/IOC. Это позволяет им избежать дорогостоящего анализа на основе отражения, обычно связанного с контейнерами DI, найденными в не-Android Java. Не вдаваясь в специфику, Кинжал и Трансфузия действительно подходят к генерации кода по-разному, что отражается на особенностях библиотек. Кроме того, Transfuse и Dagger используют общие аннотации JSR330 (@Inject, Provider и т. Д.). Это означает, что они оба следуют схеме инъекций в стиле Guice.

Вот как создать граф объектов в Dagger:

public class DaggerActivity extends Activity { 

    @Inject Example example; 

    @Override protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ObjectGraph.create().inject(this); 
     //do something else... 
    } 
} 

Эквивалентный код в переливать использует @Factory функциональность:

@Factory 
public interface Injector { 
    Example get(); 
} 

public class TransfuseActivity extends Activity { 

    Example example; 

    @Override protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     example = Factories.get(Injector.class).get(); 
     //do something else... 
    } 
} 

переливать предназначается для использования следующим образом, однако, используя компоненты POJO, события жизненного цикла и т. д .:

@Activity 
public class TransfuseActivity{ 

    @Inject Example example; 

    @OnCreate public void doSomethingElse(){ 
     //do something else... 
    } 
} 

некоторые небольшие различия в двигателе в DI переливать и Dagger:

  1. переливать поддерживает (а также может) циклическая зависимость, Кинжал целенаправленно генерирует исключение в этом случае.
  2. Трансфузия удовлетворяет требованиям JSR330, кинжала в частности нет. Разработчики Dagger хотели ошибиться на стороне простоты, избегая инъекции метода, позволили им избежать нескольких запутанных случаев (link).
  3. Кинжал имеет двигатель, основанный на отражении, для случаев, когда код не генерировался. Transfuse не требует и требует, чтобы код работал (обработчик аннотации для запуска) для работы.
  4. Transfuse вводит в частные поля, конструкторы, методы (не обязательно рекомендуемые из-за отражения накладных расходов). Кинжал выдает исключение в этом случае.
  5. Кинжал использует модули очень прямым образом, отражая возможности Guice. Каждый раз, когда вы создаете граф объектов, вам предоставляется возможность настроить его с помощью класса модуля, то есть: ObjectGraph.create(new DripCoffeeModule()). Модуль конфигурации Transfuse немного отличается, поскольку он включен в приложение во время компиляции. Каждый модуль в Transfuse является глобальным для проекта (это может измениться в будущих версиях Transfuse, но пока это не было проблемой для использования Transfuse).
  6. Синглтоны в кинжале - это графы для каждого объекта, в которых синглеты в Transfuse являются глобальными для приложения.

Большая разница между кинжалом и переливать, что Dagger сосредоточено на том, простую библиотеку Dependency Injection, в то время как фокус переливать является «make Android a better API using performance sensitive techniques»

переливать поддерживает эти возможности, а также DI:

  1. POJO Компоненты
  2. Manifest Управление
  3. Roboguice/инъекции стиль нож для масла
  4. Легкая система событий (@Observes, @OnCreate и т.д.)
  5. АОП

Я бы рекомендовал, если вы заинтересованы, дайте переливать попробовать. Лично мне хотелось бы услышать о вашем опыте, сравнив его с кинжалом. У нас есть mailing list, где вы можете поделиться с сообществом и довольно через documentation на сайте.

+0

это замечательно. большое спасибо. –

+0

@johncarl Это библиотека FANTASTIC! Но мне интересно, почему он так широко не используется, как AndroidAnnotations и Dagger, будучи гораздо более полным и надежным? Могу ли я полагаться на это в своем приложении и быть уверенным, что вы не откажетесь от него в какой-то момент в будущем? – nucleo

+0

Ответил нуклео в группах Google: https://groups.google.com/forum/#!topic/transfuse/qn3DFUMxzas –

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