问题标签 [toothpick-di]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
493 浏览

android - 有没有办法将模块重新添加到 Toothpick DI 库中的范围?

我有一个用例似乎表明需要scope.removeModules(...)Toothpick DI 库中提供类似的东西。

在一个 Android 应用程序中,我有一个模块,它创建一个与类的绑定,该类通过 Retrofit-library 接口与服务器通信。实际的服务器 url 在创建该类时指定,因此作为模块的构造函数参数提供:

现在的问题是这个模块是一个应用程序范围的模块,必须添加到应用程序范围(根范围),但serverUrl用户稍后可以重新配置。这意味着MyServerApi需要重新创建。一旦更改了 url,就能够将整个模块删除 + 再次添加到根范围,这似乎很棒。

这样,整个应用程序仍然可以Toothpick.openScope(getApplication())访问并访问最新配置的MyServerApi与正确的对话实例serverUrl

我想知道我是否遗漏了这个库做出的一些设计选择,而无需向removeModules()库中添加方法就可以实现上述目标?

0 投票
1 回答
414 浏览

toothpick-di - 如何从 Toothpick 中的同一模块传递依赖项的实例?

假设我有一个模块,其中一个绑定依赖于另一个:

在这里,我只能创建OkHttpClient具有另一个绑定的实例,即SettingsStorage. 但是怎么做呢?

目前我认为没有办法SettingsStorage在模块内获取绑定实例以将其传递给createOkHttpClient()

在 Dagger 中,我将简单地创建两个具有适当参数的提供程序方法,例如

它会自行解决所有问题,并将适当的 sessionStorage 实例传递给第二个提供程序函数。

如何在牙签模块中实现相同的功能?

0 投票
1 回答
514 浏览

android - proguard牙签尺怎么用?

我在我的项目中使用 TP。
我正在使用 TP 注入一些对象。但是当我在我的应用程序中应用 proguard 规则时。它在调试模式下工作正常但是在发布模式下给空对象我通过@Inject 注释注入的所有对象。

0 投票
1 回答
869 浏览

android - 牙签 NoFactoryFoundException

我正在开发的应用程序在生产中崩溃,用户正在报告以下堆栈跟踪。问题是我自己无法重现它。

对于不同的用户,它在不同的时间在不同的活动中崩溃。如下所示,缺失的工厂存在(至少对我而言)。

失踪的工厂:

模块:

当使用Toothpick反射或无反射配置时会发生这种情况。关于为什么我得到这个例外的任何想法?

0 投票
1 回答
1254 浏览

android - 如何用牙签注入 Map<> 或 Set<>(匕首 2 多重绑定)

Dagger 2 能够通过多重绑定注入集合或映射。如何在牙签中做到这一点

例如我想要 @Inject constructor(val map: Map<String, ISyncRepository>)

0 投票
1 回答
838 浏览

java - 牙签绑定相互依赖的模块

我正在尝试牙签 DI 库,但我似乎错过了一些重要的东西。

我在 github上创建了以下测试项目,我尝试为我的理解问题创建一个尽可能小的用例。

在那里你会找到ApplicationModule我尝试在我的“根”模块中注入我需要的一切。如您所见,我有两次,scope.installModules(module)因为我PlainPojo取决于Application实例。如果我不进行第一次installModule调用,则范围内没有应用程序实例。正如评论中提到的,我可以将应用程序实例作为参数传递,但我认为我可以在使用 DI 时删除它们?

引起麻烦的第二个类是SimpleTest类。如果我不调用inject()构造函数中的方法,则不会注入PlainPojo成员。我还尝试在绑定 PlainPojo 后第三次使用installModules()ApplicationModule但这无济于事。

假设@Inject成员上的 an 足以在范围内可用时自动注入它并且绑定顺序足以使以前的绑定可用而无需在两者之间安装(如在 中完成ApplicationModule),我是否如此错误?

如果我可以提供更多信息以使我的问题易于理解,请发表评论。

提前致谢!

0 投票
2 回答
348 浏览

java - 有没有办法忽略牙签中的绑定覆盖?

假设我有S1具有绑定模块的范围:

然后S2范围S1作为父 ( S1 -> S2) 打开并S2定义相同的绑定(因为它是独立的并且一无所知S1):

默认情况下,Toothpick 会覆盖父范围依赖项,因此S2RepositoryImpl创建一个新的。

问题:有没有办法重用创建的S1并忽略S2绑定?

这个要求来自这样一个事实,即有时存在独立的应用程序组件,它们驻留在不同的范围内并且共享该Repository依赖关系。他们彼此一无所知。这些组件也可以根据场景和用例以不同的顺序创建。

所以我要强加的唯一规则是:某个组件(确切地不知道是哪个)创建Repository的,所有这些都是稍后在当前子范围中创建的——重用它。

0 投票
1 回答
1469 浏览

java - 无法在 Fragment 中使用 Toothpick.inject

尝试在片段中使用 Toothpick DI 时出现奇怪的错误:

othpick.registries.NoFactoryFoundException:找不到类 android.app.Application 的工厂。检查该类是否具有 @Inject 带注释的构造函数或包含 @Inject 带注释的成员。如果使用注册表,请检查它们是否使用注释处理器参数正确设置。

我的片段:

活动:

奇怪的是我只在片段中得到错误,其他地方的所有注入(ViewRenderers,适配器,服务等)都可以正常工作,没有问题

0 投票
1 回答
434 浏览

android - 用牙签在仪器化测试中注入成员

我使用Toothpick DI进行了检测 Android 测试:

完整回购文件)。

应用程序的其余部分工作正常,我的 Activity、Services 和 Fragments 上的注入工作正常。

当我Toothpick.inject(otherThing, scope);在仪器测试中调用不同类的实例时,该注入工作正常。

我的怀疑是 Tests 类(或应用程序?)@Inject由于某种原因没有正确找到装饰成员。

我试过scope.installModules(module);了,也不管用。

我的 gradle 文件的一些位:

完整的 gradle文件

0 投票
1 回答
524 浏览

java - 将 Toothpick DI 框架与 Java(仅限)项目一起使用

我开始了一个小型的概念验证练习,以使我们使用现有的基于 Gradle 的 Java 项目的Toothpick DI 框架。我已经阅读了很多声称您可以将 Toothpick 与 Java 一起使用(意思是 JRE、OpenJDK、JDK 或 JSE - 没有 Android)......但是,我能够检查/处理的每​​个示例在某些时候都有以某种方式对 Android 的依赖,形状或configuration.

到目前为止,最(部分)成功的努力是使用一个实验性的、一次性的 Android 模拟包来让我的 Java 项目至少编译没有错误。也就是说,解决任何应该生成的依赖项都是空白的,例如:

  • 生成MemberInjectorRegistry
  • 生成FactoryRegistry

Toothpick 示例项目本身和更简单的可用示例都使用 Android 配置,并且通常不依赖于其他 Android 细节。

更新二

我指导了Toothpick 示例项目,一个 Java 项目

Tootpick wiki 和示例项目使用 Java 编译选项:

这给了我一个警告,结果证明是 Gradle 和插件不匹配。而且我需要一个带有--refresh-dependencies提示:确保编译TestsPackages)的新版本。

修复该示例后,将编译并通过单元测试。生成的文件在下面build/generated,我设法鼓励 Netbeans用这个找到它们:

可悲的是,Netbeans 继续在生成的符号下添加小红线。至少它运行。Netbeans 支持可能会更好。

我之前的实验是在 Toothpick 上进行的Smoothie,它是一个 Android 示例。作为智力锻炼有点有趣......

build.gradle文件依赖于 Android。所以我尝试用模拟替代品来代替缺失的组件。该项目编译但找不到(任何)生成的代码。

我现在已经考虑到可能至少有一个成功的 Java JRE/JDK Toothpick 项目示例“在那里”。

更新一

我决定从另一端解决这个问题,并查看常见的 Java 注释处理示例。据我所知,这适用于 Gradle v 4.7(我认为也是 v4.6)。

在您的(子)项目build.gradle中...

前面dep_toothpickCompiler定义为:

结果...

这一步至少设法创建了一个

  • build/generated文件夹

不幸的是,到目前为止没有生成输出。我敢肯定,隧道尽头有光。如果/当我接近解决方案时,我会在这里发布更新。


学习示例(GitHub)

我已经确定了一些“可靠”的牙签示例。到目前为止,他们希望 Android 出现在某个地方。作为 Android 目标模块或使用相关依赖项。

假设(或假设)纯 Java / Toothpick 项目可以在桌面或命令行上构建、调试和运行;就我的谷歌搜索而言,这似乎不是一个受欢迎的选择......

--