【问题标题】:How does Transfuse compare with Dagger?Transfuse 与 Dagger 相比如何?
【发布时间】:2013-11-30 23:10:01
【问题描述】:

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

【问题讨论】:

    标签: android dependency-injection comparison dagger transfuse


    【解决方案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 引擎的一些小差异:

    1. Transfuse 支持(尽可能)循环依赖,Dagger 在这种情况下故意抛出异常。
    2. Transfuse 满足 JSR330,Dagger 明确不满足。 Dagger 开发人员希望在简单性方面犯错,避免方法注入让他们避免了一些令人困惑的情况 (link)。
    3. Dagger 有一个基于反射的引擎,用于未生成代码的情况。 Transfuse 不需要并且需要生成代码(运行注释处理器)才能工作。
    4. Transfuse 将注入私有字段、构造函数、方法(不一定推荐,因为反射开销)。 Dagger 在这种情况下会抛出异常。
    5. Dagger 以非常直接的方式使用模块,反映了 Guice 的功能。每次创建对象图时,您都可以选择使用模块类对其进行配置,即:ObjectGraph.create(new DripCoffeeModule())。 Transfuse 的配置模块有点不同,因为它在编译时被合并到应用程序中。 Transfuse 中的每个模块对项目都是全局的(这可能会在未来版本的 Transfuse 中发生变化,但对于 Transfuse 的使用来说还不是问题)。
    6. Dagger 中的单例是基于对象图的,而 Transfuse 中的单例对于应用程序来说是全局的。

    Dagger 和 Transfuse 最大的区别在于 Dagger 专注于做一个简单的依赖注入库,而 Transfuse 的重点是“make Android a better API using performance sensitive techniques

    Transfuse 支持这些功能以及 DI:

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

    如果您有兴趣,我建议您试试 Transfuse。就个人而言,我很想听听你将它与 Dagger 进行对比的经历。我们有一个mailing list,您可以通过网站上的documentation 与社区分享和美化。

    【讨论】:

    • @johncarl 这是一个很棒的图书馆!但我想知道为什么它不像 AndroidAnnotations 和 Dagger 那样被广泛使用,同时更加完整和健壮?我可以在我的应用程序中依赖它,并确保您不会在未来某个时刻放弃它吗?
    • 在 Google 网上论坛上回答了 nucleo:groups.google.com/forum/#!topic/transfuse/qn3DFUMxzas
    • @nucleo 正如它所说,Dagger 是一个非常简单的 DI,没有其他功能或要求复杂化。我自己发现 Transfuse 更有用,但由于实现简单,在我的大部分应用程序中使用 Dagger。
    猜你喜欢
    • 2013-05-26
    • 2011-02-07
    • 2023-03-26
    • 2010-09-06
    • 2011-03-17
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多