我正在尝试确定是否将Transfuse或Dagger用于Android依赖项注入(inject)。我从未使用过Transfuse,并且对Dagger有基本的了解。非常感谢。

最佳答案

首先,我是Transfuse的主要作者,因此该答案可能朝那个方向倾斜了一点。

Transfuse和Dagger都以类似方式处理Android的依赖项注入(inject)/控制反转。两者都在编译时通过JSR269使用注释处理来生成支持DI/IOC功能的代码。这样一来,他们就可以避免通常与非Android Java中的DI容器相关的昂贵的基于运行时反射的分析。无需赘述,Dagger和Transfuse确实以明显不同的方式处理代码生成,这反射(reflect)在库的功能中。另外,Transfuse和Dagger都使用通用的JSR330批注(@ Inject,Provider等)。这意味着它们都遵循Guice风格的注入(inject)方案。

这是在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引擎的一些小差异:
  • Transfuse支持(并尽可能)支持循环依赖关系,在这种情况下Dagger有目的地引发异常。
  • Transfuse满足JSR330,而Dagger则没有。 Dagger开发人员希望在简化方面犯错,避免方法注入(inject)使他们避免了一些令人困惑的情况(link)。
  • Dagger在未生成代码的情况下具有基于反射的引擎。 Transfuse不需要,并且需要生成代码才能运行(运行注释处理器)。
  • Transfuse将注入(inject)到私有(private)字段,构造函数,方法中(由于反射开销而不一定推荐)。在这种情况下, Dagger 会引发异常。
  • Dagger以非常直接的方式使用模块,从而反射(reflect)了Guice的功能。每次创建对象图时,都可以选择使用Module类(即ObjectGraph.create(new DripCoffeeModule()))对其进行配置。 Transfuse的配置模块有些不同,因为它是在编译时合并到应用程序中的。 Transfuse中的每个模块对于项目都是全局的(在将来的Transfuse版本中可能会更改,但是使用Transfuse尚未成为问题)。
  • Dagger 中的
  • 单例是每个对象的图,其中Transfuse中的单例对于应用程序是全局的。

  • Dagger与Transfuse的最大区别在于Dagger专注于成为一个简单的依赖注入(inject)库,而Transfuse的重点是“make Android a better API using performance sensitive techniques

    Transfuse支持以下功能以及DI:
  • POJO组件
  • list 管理
  • Roboguice/黄油刀样式注入(inject)
  • 轻量级事件系统(@ Observes,@ OnCreate等)
  • AOP

  • 我建议,如果您有兴趣,请尝试一下Transfuse。就个人而言,我很想听听您与Dagger进行对比的经历。我们有一个mailing list,您可以在其中与社区共享,也可以通过网站上的documentation进行分享。

    10-08 17:37