【发布时间】:2013-11-30 23:10:01
【问题描述】:
我正在尝试决定是使用 Transfuse 还是 Dagger 进行 Android 依赖注入。我从未使用过 Transfuse,并且对 Dagger 有基本的了解。非常感谢。
【问题讨论】:
标签: android dependency-injection comparison dagger transfuse
我正在尝试决定是使用 Transfuse 还是 Dagger 进行 Android 依赖注入。我从未使用过 Transfuse,并且对 Dagger 有基本的了解。非常感谢。
【问题讨论】:
标签: android dependency-injection comparison dagger transfuse
首先,我是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 引擎的一些小差异:
ObjectGraph.create(new DripCoffeeModule())。 Transfuse 的配置模块有点不同,因为它在编译时被合并到应用程序中。 Transfuse 中的每个模块对项目都是全局的(这可能会在未来版本的 Transfuse 中发生变化,但对于 Transfuse 的使用来说还不是问题)。Dagger 和 Transfuse 最大的区别在于 Dagger 专注于做一个简单的依赖注入库,而 Transfuse 的重点是“make Android a better API using performance sensitive techniques”
Transfuse 支持这些功能以及 DI:
如果您有兴趣,我建议您试试 Transfuse。就个人而言,我很想听听你将它与 Dagger 进行对比的经历。我们有一个mailing list,您可以通过网站上的documentation 与社区分享和美化。
【讨论】: