Transfuse 与 Dagger 相比如何?

2024-01-07

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


首先,我是输血 http://androidtransfuse.org因此这个答案可能有点偏向这个方向。

Transfuse 和 Dagger 都以类似的方式处理 Android 的依赖注入/控制反转。两者都在编译时使用注释处理JSR269 http://jcp.org/en/jsr/detail?id=269生成支持 DI/IOC 功能的代码。这使他们能够避免通常与非 Android Java 中的 DI 容器相关的昂贵的运行时基于反射的分析。无需详细说明,Dagger 和 Transfuse 确实以显着不同的方式生成代码,这反映在库的功能中。此外,Transfuse 和 Dagger 都使用通用的JSR330 http://jcp.org/en/jsr/detail?id=330注释(@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 https://github.com/square/dagger/issues/214#issuecomment-16934877).
  3. Dagger 有一个基于反射的引擎,适用于未生成代码的情况。 Transfuse 不需要,并且需要生成代码(运行注释处理器)才能工作。
  4. Transfuse 将注入私有字段、构造函数、方法(由于反射开销,不一定推荐)。 Dagger 在这种情况下会抛出异常。
  5. Dagger 以非常直接的方式使用模块,反映了 Guice 的功能。每次创建对象图时,您都可以选择使用模块类对其进行配置,即:ObjectGraph.create(new DripCoffeeModule())。 Transfuse 的配置模块有点不同,因为它在编译时合并到应用程序中。 Transfuse 中的每个模块对于项目来说都是全局的(这可能在 Transfuse 的未来版本中发生变化,但这对于 Transfuse 的使用来说还不是问题)。
  6. Dagger 中的单例是每个对象图,而 Transfuse 中的单例对于应用程序来说是全局的。

Dagger 和 Transfuse 之间的最大区别在于,Dagger 专注于成为一个简单的依赖注入库,而 Transfuse 的重点是“使用性能敏感技术使 Android 成为更好的 API http://androidtransfuse.org/documentation.html#introduction"

Transfuse 支持这些功能以及 DI:

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

如果您有兴趣,我建议您尝试一下 Transfuse。就我个人而言,我很想听听您将其与 Dagger 进行对比的经历。我们有一个邮件列表 https://groups.google.com/forum/#!forum/transfuse您可以在其中与社区分享并通过文档 http://androidtransfuse.org/documentation.html在网站上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Transfuse 与 Dagger 相比如何? 的相关文章

随机推荐

  • 单个变量的线程安全

    我了解线程安全的概念 我正在寻找在尝试保护单个变量时简化线程安全的建议 假设我有一个变量 double aPass 我想保护这个变量 所以我创建了一个互斥体 pthread mutex t aPass lock 现在我可以想到两种好方法 但
  • 导入打字稿时如何在路径中使用变量

    是否可以将变量 或常量 放入路径中 而不是将整个路径写为字符串文字 看起来 Angular 除了字符串文字之外不接受任何内容 import aClass require simpleClass import aComponent from
  • 将 pandas 数据框转换为 pandas 系列

    我需要一些有关数据类型问题的帮助 我正在尝试转换 pandas 数据框 如下所示 timestamp number 2018 01 01 1 2018 02 01 0 2018 03 01 5 2018 04 01 0 2018 05 01
  • 从 NSURLConnection 的响应头中读取数据

    如何从服务器响应中发送的标头中读取数据 我正在使用 NSURLConnection 发送请求 如果 URL 是 HTTP URL 则NSURLResponse您在连接的委托中收到的 connection didReceiveResponse
  • xampp mysql 和 phpmyadmin 不起作用

    昨天我使用 xampp 并使用 apache 和 mysql 服务 今天想启动mysql服务 没成功 我尝试在论坛上搜索解决方案 但找不到任何内容 所以我问你 在 mysql 停止工作后 我在日志文件中找到此消息 2015 10 29 12
  • ASP.NET MVC 将数据从视图传递到控制器

    我有一个带有网格的视图 其中包含添加到工作站的项目 用户可以从下拉列表中选择一个项目 然后单击一个操作链接 该链接调用控制器将该项目添加到工作站 我可以通过读取控制器的 Post 操作中的 FormCollection 对象来使其工作 p
  • 如何在 AWS 负载均衡器响应中禁用 Apache HTTP 标头信息?

    我在 Apache 服务器上使用 AWS Elastic Beanstalk 部署了一个 node js 环境 我对环境运行了 PCI 扫描 但出现了 2 次失败 Apache ServerTokens 信息披露 Web服务器HTTP头信息
  • 从逗号分隔字段中选择

    说我有一个subscribers表 每个用户都有一行 如下所示 id name subscribers 1 user1 user2 user3 user4 2 user2 user4 user5 user3 3 user3 user1 us
  • Apache Spark:核心数量与执行器数量

    我试图了解在 YARN 上运行 Spark 作业时核心数量和执行器数量的关系 测试环境如下 数据节点数量 3 Data node machine spec CPU Core i7 4790 核心数 4 线程数 8 内存 32GB 8GB x
  • Firebase 功能 HTTPS 403 禁止

    我使用 Node 和 Express 构建了 Firebase HTTP 事件函数 该函数正在工作 但是当我在客户端调用该函数时 我得到403 Forbidden 第一次调用该功能时 我被要求使用 Google 帐户登录 我使用与 Fire
  • Python xml - 处理未封闭的令牌

    我正在读取数百个 XML 文件并使用 xml etree ElementTree 解析它们 快速背景 这些 XML 文件在某一时刻是完全有效的 但不知何故 在历史上处理它们时 我复制 粘贴它们的过程可能已损坏它们 事实证明 这是一个冲洗问题
  • 防止更改 String.Empty 的值

    部分是出于好奇的破坏事物的角度 部分是出于防范潜在问题的目的 想象一下通过调用以下内容 或类似的内容 但是string Empty是一个很好的例子 typeof String GetField Empty BindingFlags Publ
  • Gradle 不包括已发布的 pom.xml 中的依赖项

    我有一个 Gradle 项目 我正在使用Maven 发布者用于将我的 Android 库安装到 Maven 本地和 Maven 存储库的插件 这可行 但生成的 pom xml 不包含任何依赖项信息 是否有解决方法来包含该信息 或者我是否被迫
  • 通过从当前日期减去秒来获取日期时间

    我想从日期中减去秒 例如 假设我有 1300 秒的无符号整数 我想获取当前日期和时间 从中减去 1 300 秒 最后得到 01 13 2012 2 15 PM 格式并不重要 我确实尝试过 DateTime dt new DateTime d
  • 为什么我无法截取 MPMoviePlayerController 的屏幕截图?

    我需要捕获在 mpmovieplayer 控制器中播放的视频的屏幕截图 但我得到的只是一个红色屏幕 我用红色背景和 0 5 alpha 制作了 coverView 这是代码 NSArray windows UIApplication sha
  • 使用 Groovy(Grails) 写入文件的某些行失败(断行)

    我正在使用 Groovy 在 csv 文件中进行大量写入 更具体地说 我有一个正在运行的 Quartz 作业 它创建一些发送到 RabbitMQ 队列的 Map 消息 该队列正在被 10 个消费者使用 并导致生成一些字符串列表 对于列表中的
  • 如何解决私有字节(本机内存)泄漏?

    我正在开发一个 C 应用程序 该应用程序似乎存在泄漏 我使用过内存分析器并发现我的 私有字节继续增加但是所有堆中的字节数不 这意味着可能是本机内存泄漏 现在我陷入困境 如何找到本机代码中的内存泄漏 首先 如果您有泄漏进程的转储 您可以在 W
  • 如何在按钮单击时使用 TypeScript

    我正在尝试在我的应用程序中使用打字稿 同样 我正在做一个 POC 在 POC 中我想在单击按钮时调用 TypeScript 类中定义的函数 可以调用函数吗 如果是的话怎么办 到目前为止 我已经看到了仅在页面加载时调用函数的示例 我需要在某些
  • 如何在 django 中构建 json REST API(没有 Django REST 框架)

    Preface 我有一个 Django 项目 我已经将它连接起来 以便它为一堆模型提供一堆视图 现在我想添加一个端点 它将数据库的很大一部分转储为 json 我假设您执行此操作的方法是将 URL 添加到视图类 方法 该视图类 方法返回充满
  • Transfuse 与 Dagger 相比如何?

    我正在尝试决定是使用 Transfuse 还是 Dagger 进行 Android 依赖注入 我从未使用过 Transfuse 并且对 Dagger 有基本了解 非常感谢 首先 我是输血 http androidtransfuse org因