6

我正在尝试决定是否使用 Transfuse 或 Dagger 进行 Android 依赖注入。我从未使用过 Transfuse,并且对 Dagger 有基本的了解。非常感谢。

4

1 回答 1

12

首先,我是Transfuse的主要作者,因此这个答案可能有点偏向那个方向。

Transfuse 和 Dagger 都以类似的方式处理 Android 的依赖注入/控制反转。两者都通过JSR269在编译时使用注释处理来生成支持 DI/IOC 功能的代码。这使他们能够避免通常与非 Android Java 中的 DI 容器相关的昂贵的基于运行时反射的分析。在不深入细节的情况下,Dagger 和 Transfuse 确实以明显不同的方式处理代码生成,这反映在库的特性中。此外,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...
    }
}

Transfuse 中的等效代码使用其 @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...
    }
}

Transfuse 旨在以下列方式使用,然而,利用 POJO 组件、生命周期事件等:

@Activity
public class TransfuseActivity{

    @Inject Example example;

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

以下是 Transfuse 和 Dagger 中 DI 引擎的一些小差异:

  1. Transfuse 支持(尽可能)循环依赖,Dagger 在这种情况下故意抛出异常。
  2. Transfuse 满足 JSR330,Dagger 明确不满足。Dagger 开发人员希望在简单方面犯错,避免方法注入使他们能够避免一些令人困惑的情况(链接)。
  3. Dagger 有一个基于反射的引擎,用于未生成代码的情况。Transfuse 不需要并且需要生成代码(运行注释处理器)才能工作。
  4. Transfuse 将注入私有字段、构造函数、方法(不一定推荐,因为反射开销)。Dagger 在这种情况下会抛出异常。
  5. Dagger 以非常直接的方式使用模块,反映了 Guice 的功能。每次创建对象图时,您都可以选择使用 Module 类对其进行配置,即:ObjectGraph.create(new DripCoffeeModule()). Transfuse 的配置模块有点不同,因为它在编译时被合并到应用程序中。Transfuse 中的每个模块对项目都是全局的(这可能会在 Transfuse 的未来版本中发生变化,但对于 Transfuse 的使用来说还不是问题)。
  6. Dagger 中的单例是每个对象图,其中 Transfuse 中的单例对应用程序是全局的。

Dagger 和 Transfuse 最大的区别在于 Dagger 专注于成为一个简单的依赖注入库,而 Transfuse 的重点是“使用性能敏感技术使 Android 成为更好的 API

Transfuse 支持这些功能以及 DI:

  1. POJO 组件
  2. 清单管理
  3. Roboguice/Butterknife 风格注射
  4. 轻量级事件系统(@Observes、@OnCreate 等)
  5. AOP

如果你有兴趣,我建议你试试 Transfuse。就个人而言,我很想听听你将它与 Dagger 进行对比的经历。我们有一个邮件列表,您可以在其中与社区分享,并通过网站上的文档进行漂亮的分享。

于 2013-12-01T15:49:36.363 回答