Transfuse 与 Dagger 相比如何?

2024-01-07

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


首先,我是输血 http://androidtransfuse.org因此这个答案可能有点偏向这个方向。

Transfuse 和 Dagger 都以类似的方式处理 Android 的依赖注入/控制反转。两者都在编译时使用注释处理JSR269 http://jcp.org/en/jsr/detail?id=269生成支持 DI/IOC 功能的代码。这使他们能够避免通常与非 Android Java 中的 DI 容器相关的昂贵的运行时基于反射的分析。无需详细说明,Dagger 和 Transfuse 确实以显着不同的方式生成代码,这反映在库的功能中。此外,Transfuse 和 Dagger 都使用通用的JSR330 http://jcp.org/en/jsr/detail?id=330注释(@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 开发人员希望在简单性方面犯错误,避免方法注入使他们能够避免一些令人困惑的情况(link https://github.com/square/dagger/issues/214#issuecomment-16934877).
  3. Dagger 有一个基于反射的引擎,适用于未生成代码的情况。 Transfuse 不需要,并且需要生成代码(运行注释处理器)才能工作。
  4. Transfuse 将注入私有字段、构造函数、方法(由于反射开销,不一定推荐)。 Dagger 在这种情况下会抛出异常。
  5. Dagger 以非常直接的方式使用模块,反映了 Guice 的功能。每次创建对象图时,您都可以选择使用模块类对其进行配置,即:ObjectGraph.create(new DripCoffeeModule())。 Transfuse 的配置模块有点不同,因为它在编译时合并到应用程序中。 Transfuse 中的每个模块对于项目来说都是全局的(这可能在 Transfuse 的未来版本中发生变化,但这对于 Transfuse 的使用来说还不是问题)。
  6. Dagger 中的单例是每个对象图,而 Transfuse 中的单例对于应用程序来说是全局的。

Dagger 和 Transfuse 之间的最大区别在于,Dagger 专注于成为一个简单的依赖注入库,而 Transfuse 的重点是“使用性能敏感技术使 Android 成为更好的 API http://androidtransfuse.org/documentation.html#introduction"

Transfuse 支持这些功能以及 DI:

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

如果您有兴趣,我建议您尝试一下 Transfuse。就我个人而言,我很想听听您将其与 Dagger 进行对比的经历。我们有一个邮件列表 https://groups.google.com/forum/#!forum/transfuse您可以在其中与社区分享并通过文档 http://androidtransfuse.org/documentation.html在网站上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Transfuse 与 Dagger 相比如何? 的相关文章