问题标签 [assisted-inject]
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.
java - Guice:辅助注射和提供者
假设我有一个类如下:
现在,我有一个ComplicatedFactory
这样的:
是否有可能,在使用时FactoryModuleBuilder
,绑定 aComplicatedFactory
这样,当build()
被调用时,我们做相当于
与直接返回新的正常情况相反ComplicatedImpl
?
我一直试图绑定ComplicatedImpl
到某种形式的Provider
,但似乎我会绕着那个圈子转……
java - 如何将 Guice AssistedInject 与接口的多个实现一起使用?
我很难找到如何拥有“动态 AssistedInject”。我的意思是我想根据参数向工厂提供它需要在运行时使用的实现类名。这是我目前拥有的:
考虑到我将拥有 T1 但我需要注入 T2,我希望能够根据他们的名称加载 A 或 B。它可能看起来像:
我会使用类似的东西配置 ILetterFactory:
但我知道这目前不起作用,因为字母名称不是我的构造函数的真正参数,而 Guice 不能那样工作。它应该让你知道我想要什么。
我目前发现的唯一解决方案不使用 Guice:我有自己的工厂,它根据名称(通过 a Map<String, Constructor>
)解析类构造函数,并调用newInstance
为它提供适当的参数(除了工厂本身之外,根本没有注入)。
有没有办法使用 Guice 来避免自己创建那个工厂?谢谢
java - Guice、FactoryModuleBuilder、多种实现和泛型
我正在使用 Guice 和 FactoryModuleBuilder。通常,只定义一个工厂接口就足够了,Guice 会自动注入实现。
但是,我正在努力的部分是工厂中的方法使用泛型。假设我有以下内容。接口定义的构造实例的基本类型。
Foo
以及由以下两个类定义的接口的两个实现。
然后我有如下定义的工厂接口,使用两个自定义绑定注释,允许我使用多个实现。
我已经尝试了许多可能的解决方案,但到目前为止,除了一个之外,所有解决方案都有效。有效的解决方案基本上是编写我自己的实现,FooFactory
如下所示。并且在configure
模块的方法中,将接口绑定到实现上;bind(FooFactory.class).to(FooFactoryImpl.class);
但是,我对这个解决方案有一个问题。这些实例不是由 Guice 创建的,因此我丢失了 Guice 附带的空检查。这与我的其他没有这个问题的工厂截然不同。这意味着我必须为Foo
. 我想避免这种情况。
以下是我尝试过的一些解决方案。
解决方案1:
解决方案2:
示例代码可在GitHub 上获得(如果有人感兴趣)。
java - Guice 辅助注入已配置
我对 AssistedInject 有疑问。我按照此链接 https://github.com/google/guice/wiki/AssistedInject上的说明进行操作, 但是当我运行我的应用程序时出现错误:
这是我的模块配置:
这是我的工厂的样子:
接口声明如下:
这是实现
我正在使用 dropwizard guice 包。
为什么会出现这个错误?
java - 我怎样才能使非辅助依赖辅助?
假设我有一个第三方类如下:
现在假设我有一个这样的工厂接口:
这个想法是我希望有一个为一个固定的MyObjectFactory
构建一个- 也就是说,本质上是从外部在构造函数参数上添加注释。当然,手动实现总是可行的:MyObject
Foo
@Assisted
Bar
MyObjectFactory
但是假设有一些条件需要我让 Guice 构建MyObject
实例——例如,方法拦截器。这似乎是“注入注射器”的工作:
这听起来很邪恶和样板,所以我想知道是否有任何替代实现和/或让 Guice 生成工厂 impl 的方法。
java - 如何使用 Guice 使 Multibinder 与 FactoryModuleBuilder 和泛型一起使用?
我已经阅读了Google guice - multibinding + generics +assistedinject但它似乎没有回答我的具体情况。这是我所拥有的:
使用的接口FactoryModuleBuilder
我的 Guice 模块:
我的主过滤器应该结合所有其他过滤器:
这实际上是行不通的。我得到以下堆栈跟踪:
我在这里做错什么了吗?
java - Guice 根据父实例注解注入不同的实例
我在我的应用程序中使用 guice 框架。我有一个场景,其中一个类可能需要相同接口 C 的多个实例(但用于不同的目的),如示例中所示。我正在尝试使用 guice 中的注释工具来解决这个问题。
如下例所示,我希望 ConcreteImpl 的配置也由 guice 注入。但问题是 type1、type2 和 type3 实例的配置可能不同。假设我先验地拥有这些实例的配置,是否可以根据请求配置的实例的上下文(由注释表示)注入它们?
我的模块绑定是这样的 -
这几乎就是我想要做的
我已经看过辅助注入,它可以注入工厂,然后我们使用 factory.create(config) 但我不倾向于这样做,因为合同往往会变得更丑陋,而且我拥有的所有配置都在启动我的应用程序,应该能够注入它们。
java - 使用 Roboguice 的 Android 辅助注入 Factory 无法正常工作
我试图在构造函数中传递一些参数时注入一些类。为了实现这一点,我发现这个问题(1、2 )说这可以通过使用工厂辅助注射来实现。这就是我的代码的样子,遵循提供的示例和阅读相关文档后的一些修改。
梯度脚本
带有接受参数的 create 方法的工厂接口
实现接口的类
从应用程序类使用和调用的模块
从 Application 类注册的注入模块
使用工厂
有了这样的一切,当我尝试使用工厂时出现此错误,因为它已用于SomeClass
有人知道为什么工厂没有初始化吗?我知道应该由模块初始化,并且我确定它被调用的模块。
我的代码与链接问题中的代码之间最显着的区别是,在问题中,构造函数被注释为@Inject
,而不是@AssistedInject
。在此修改之前,我在编译应用程序时遇到此错误。
错误:任务“:app:compileDebugJavaWithJavac”执行失败。java.lang.ClassCastException: com.sun.tools.javac.code.Type cannot be cast to javax.lang.model.type.DeclaredType dle的依赖缓存可能已损坏(有时会在网络连接超时后发生。)重新下载依赖项和同步项目(需要网络)
Gradle 构建过程(守护进程)的状态可能已损坏。停止所有 Gradle 守护程序可能会解决此问题。停止 Gradle 构建过程(需要重新启动) 您的项目可能正在使用与项目中的其他插件或项目请求的 Gradle 版本不兼容的第三方插件。 在 Gradle 进程损坏的情况下,您还可以尝试关闭 IDE,然后杀死所有 Java 进程。
也许这不是实现我需要的最佳方法。如果不是,有人可以指出正确的方向吗?
谢谢大家的帮助
java - 在测试中使用 AssistedInject
我阅读了几个教程和手册,但它们都跳过了我真正需要的部分,这是你运行这些东西的实际部分。
我的情况如下。
我有一个Connection
界面:
我有一个需要一个生产实现SocketFactory
:
所以我创建了一个ConnectionFactory
:
现在,我有两个SocketFactory
:SocketFactoryProd
和SocketFactoryTest
.
我正在创建一个 TestConnection
并且我想创建一个ConnectionImpl
with SocketFactoryTest
,但我真的不知道我是怎么做的。这是我一直缺少的部分,我应该在我的测试(或测试类setUp
)中写什么。
java - 在 Guice 中管理复杂的生命周期
我遇到了一种情况,我有一个数据对象图,并且想为该图上的每个节点创建一个服务。问题是该服务(及其依赖项)依赖于他们正在工作的节点。像这样的东西:
请注意,我在这里的意图是为图中的每个节点创建 的新实例Service
和任何依赖项的新实例。Service
所以现在我有几个选择:
guice
由辅助注射工厂提供支持。这就是我们目前正在做的事情,并且要求对 node 的依赖关系通过服务所依赖的所有内容进行curry up,如果它们也依赖于node
. 换句话说,如果我在这里使用辅助注入工厂,我必须对每个service
依赖的类都使用它,这很讨厌。- 我可以使用我们所说的嵌套引导程序,即带有新注入器的新模块,实际上是一个新环境,并且在该环境的设置中我可以编写
bind(Node.class).toInstance(node)
。此代码将在第一次访问时执行,并缓存其结果。 - 我可以使用 guice 的自定义范围(我认为)。
我们在几个地方完成了第二个,只是因为我和我的团队不知道自定义范围。我们现在有了自定义作用域的另一种用途,我必须承认它的实现比我想的要复杂得多。遵循本指南会有所帮助,但很明显,我将不得不深入研究线程安全的土地,而我最后一次访问那里并不那么愉快。
我应该使用什么 guice 工具来获得这种行为?