我正在尝试决定是否使用 Transfuse 或 Dagger 进行 Android 依赖注入。我从未使用过 Transfuse,并且对 Dagger 有基本的了解。非常感谢。
1 回答
首先,我是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 引擎的一些小差异:
- Transfuse 支持(尽可能)循环依赖,Dagger 在这种情况下故意抛出异常。
- Transfuse 满足 JSR330,Dagger 明确不满足。Dagger 开发人员希望在简单方面犯错,避免方法注入使他们能够避免一些令人困惑的情况(链接)。
- Dagger 有一个基于反射的引擎,用于未生成代码的情况。Transfuse 不需要并且需要生成代码(运行注释处理器)才能工作。
- Transfuse 将注入私有字段、构造函数、方法(不一定推荐,因为反射开销)。Dagger 在这种情况下会抛出异常。
- Dagger 以非常直接的方式使用模块,反映了 Guice 的功能。每次创建对象图时,您都可以选择使用 Module 类对其进行配置,即:
ObjectGraph.create(new DripCoffeeModule())
. Transfuse 的配置模块有点不同,因为它在编译时被合并到应用程序中。Transfuse 中的每个模块对项目都是全局的(这可能会在 Transfuse 的未来版本中发生变化,但对于 Transfuse 的使用来说还不是问题)。 - Dagger 中的单例是每个对象图,其中 Transfuse 中的单例对应用程序是全局的。
Dagger 和 Transfuse 最大的区别在于 Dagger 专注于成为一个简单的依赖注入库,而 Transfuse 的重点是“使用性能敏感技术使 Android 成为更好的 API ”
Transfuse 支持这些功能以及 DI:
- POJO 组件
- 清单管理
- Roboguice/Butterknife 风格注射
- 轻量级事件系统(@Observes、@OnCreate 等)
- AOP
如果你有兴趣,我建议你试试 Transfuse。就个人而言,我很想听听你将它与 Dagger 进行对比的经历。我们有一个邮件列表,您可以在其中与社区分享,并通过网站上的文档进行漂亮的分享。