我正在尝试确定是否将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引擎的一些小差异:
ObjectGraph.create(new DripCoffeeModule())
)对其进行配置。 Transfuse的配置模块有些不同,因为它是在编译时合并到应用程序中的。 Transfuse中的每个模块对于项目都是全局的(在将来的Transfuse版本中可能会更改,但是使用Transfuse尚未成为问题)。 Dagger与Transfuse的最大区别在于Dagger专注于成为一个简单的依赖注入(inject)库,而Transfuse的重点是“make Android a better API using performance sensitive techniques”
Transfuse支持以下功能以及DI:
我建议,如果您有兴趣,请尝试一下Transfuse。就个人而言,我很想听听您与Dagger进行对比的经历。我们有一个mailing list,您可以在其中与社区共享,也可以通过网站上的documentation进行分享。