问题标签 [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 中使用带有 FactoryModuleBuilder 的辅助注入 - 工厂注入未完成
我是一个 guice 新手,试图弄清楚如何使用 FactoryModuleBuilder 在 guice 中实现辅助注入。我查阅了 guice java 文档以实现FactoryModuleBuilder。
我已经按照文档中的说明完成了所有操作。它没有注入工厂。我提到了这个堆栈溢出问题:Guice AssistedInject 不会注入 有同样问题的工厂。它讨论了构造函数注入问题之前的字段注入。我跟着它,我试图使用调用者类调用父类,但我仍然得到空指针异常。这里出了什么问题?
调用者类
我仍然遇到异常:
家长班
模块实现:ParentModule
工厂接口:MyFactory
类接口:Foo
类:FooImpl
java - 使用辅助注入创建复杂的依赖树
我最近了解了 Guice 的AssistedInject扩展,我认为它可以很好地解决我遇到的一些设计问题。不幸的是,该解决方案似乎仅限于一级辅助注射。这是我的问题的一个例子 - 假设我们有三个类:
工厂接口:
和一个模块:
以上失败并出现以下堆栈跟踪:
线程“主”com.google.inject.CreationException 中的异常:Guice 创建错误:
1) 在 stack.AImpl 中找不到合适的构造函数。类必须有一个(并且只有一个)用@Inject 注释的构造函数或一个非私有的零参数构造函数。在 stack.AImpl.class(AImpl.java:12) 在 stack.ABCModule.configure(ABCModule.java:14)
2) stack.CImpl 有@AssistedInject 构造函数,但它们都不匹配方法stack.CFactory.create() 中的参数。无法创建 AssistedInject 工厂。同时定位stack.CImpl 同时定位stack.C at stack.CFactory.create(CFactory.java:1)
在 com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154) 在 com.google.inject.internal.InternalInjectorCreator 的 com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435) 有 2 个错误.build(InternalInjectorCreator.java:106) 在 com.google.inject.Guice.createInjector(Guice.java:95) 在 com.google.inject.Guice.createInjector(Guice.java:72) 在 com.google.inject。 Guice.createInjector(Guice.java:62) 在 stack.ABCModule.main(ABCModule.java:21)
这显然意味着我对扩展的要求太多了——我希望注入器会在依赖树的深处搜索@Assisted 依赖。有没有办法做这种辅助注射还是需要我自己实现我的工厂?
scala - scala-guice 和辅助注入
很长一段时间以来,我一直在使用带有辅助注入机制的 google-guice。因为我在 scala 中,只是发现了 scala-guice,我也有兴趣使用它。但是,我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。
因此我的问题是:是否可以在 scala-guice 中使用辅助注射,如果可以,请有人提供一个简单的例子吗?
此外,对于 google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar、guice-assistedInject.jar。在这种情况下,我应该删除 guice-3.0.jar 吗?
java - 辅助注射什么时候有用?
我目前在我的应用程序中使用 Guice。但是我发现自己主要使用辅助注入,因为有一系列注入对象都取决于程序的输入。因此,几乎所有东西都是辅助注射。
例如,A 需要 B,需要 C,需要 Z,需要从命令行输入。最后,我觉得一切都会被辅助注射。因此,鉴于我坚持使用它,我想确保我正确使用它。
我个人觉得写自己的工厂也一样好。此外,除了相同的优势之外,我还可以进一步将我的相关对象的创建限制在这些工厂中。
因此,我的问题是,使用辅助注入到底有多大用处,仅仅是同时辅助和非辅助的想法吗?如果在我的情况下您只有辅助参数怎么办?
他们必须通过辅助注射来组织它。我只是没看到。
如果有人能在这里启发我,我将不胜感激,
非常感谢
PS:
我的依赖是这样的:
我有一个InfrastructureService,它需要一个KnowledgeBaseService,而后者又需要一个ConFigDataObject。我的 configDataObject 包含来自程序输入的信息。configDataObject 在对这些输入进行一些验证和处理后存储这些信息。例如,可以向它提供一个表示文件路径的字符串,它会验证它是否是存在的文件,并有一个 getter 方法将该文件返回给它的使用者。其他的东西可能是 URLNname 到真正的 URL 对象,等等。
这里的重点是下图: InfrastructureService -> KnowledgeBaseService -> ConFigDataObject -> InputData
因此,InfrastructureService只能使用以正确的 inputFile、URL、工作文件夹等启动的知识库服务,它通过 configDataObject 提供给它,从程序的输入接收它们并存储处理后的版本他们。
因此,到目前为止,我所做的是有一个 assistedFactory 来创建KnowledgeBaseService。它将 ConfigDataObject 作为参数。configDataObject是使用factoryMethod (Scala Companion Object)创建的。最后,还为InfrastructureService创建了一个 assistedFactory ,其创建方法为KnowledgeBaseService。
正如您所猜想的那样,几乎所有内容都是预先创建的,并且以某种方式手动创建。我觉得很奇怪。
java - 使用 Guice Assisted Inject Factory 在 AsyncTask 中注入上下文时出错
我正在使用 RoboGuice 2.0 在 Guice Extension - Assisted Inject 的帮助下创建 Android 项目。现在我面临通过工厂在非 UI 线程上注入上下文的问题。
显示我的问题的示例项目:
人物界面:
人员实施:
Perfon工厂:
模块:
主要活动:
当执行 AsyncTask 时,注入器创建 Person 对象。此操作工作正常,并按预期返回 PersonImpl 对象。但是,当工厂尝试创建新的 Person 对象时,会引发此异常:
如果这些创建操作是在 UI 线程上执行的,那么两个 PlayerImpl 对象都会正确创建。我刚开始使用 Google Guice,我很困惑为什么当使用注入器创建对象时一切都很好,但使用工厂却不行。有什么好的解决方案如何在线程上使用工厂?
java - 使用 guice-assistedinject 链接辅助注入参数
我正在使用 Guice Assisted Inject库为我建立一个工厂。我目前的设置是这样的:
这迫使我明确地创建一个SecondDep
using factory.createController(first, factory.createSecond(first))
。是否可以更改我的绑定,以便我可以简单地做factory.createController(first)
,它会自动使用SecondDep
绑定和我传入的参数?
eclipse-plugin - Eclipse 目标平台中的 guice-assistedinject.jar 但不可添加到插件的依赖项中
我正在使用Eclipse 4.4 Luna M5开发一个Eclipse RCP应用程序,并且我正在使用Guice 3.0。 因此,我将 guice.jar 添加到了我的目标平台,并且对于我正在开发的每个插件,我都可以使用 Eclipse 的插件清单编辑器将 bundle com.google.inject 添加到插件的依赖项中。到目前为止,一切正常。
现在的问题是:我想使用 guice 辅助注入 ( @Assisted
)。
所以我将 guice-assistedinject.jar 添加到我的目标平台。(我使用的是 .target 文件 = Eclipse Target 定义文件)。
然后在 .target 文件编辑器的“内容”选项卡中,Eclipse 正确地显示了com.google.inject.assistinject
来自 guice-assistedinject.jar 的片段包 3.0,但我无法将此包或此包的导出包添加到插件项目的依赖项中正在发展。
当我在插件清单编辑器中按“添加”时,com.google.inject.assistedinject
是不是在可添加依赖项列表中?怎么了?
java - 寻找 Dagger 辅助注射的例子
来自匕首讨论@:
我有一个类,它从对象图中获取一些依赖关系,并在运行时从调用者那里获取其他依赖关系。
我想出了一个解决方案,我定义了一个工厂,
现在,我不再注入ImageDownloader
客户端的构造函数,而是简单地注入ImageDownloader.Factory
并调用它的create()
方法。
如您所见,这非常冗长且冗长。它也有一堆重复和样板。用 注释字段本身存在一些障碍@Inject
,所以现在让我们忽略这种可能性。
Square 人提出了一个有趣的解决方案,使用提供程序。定义一个Factory
接口,
然后在一个模块中提供它,
(再次,来自 dagger-discuss@)。
MyImageDownloader
是一个由另一个类注入的类注入的类,该类由另一个类注入,...,在@Module
. 这一切都以某种方式*工作,并且所有类都在构建时找到。现在,要添加一个模块,我必须明确地让对象图知道它。
我一定遗漏了一些东西——注入一个新类很容易,但添加一个新模块却很乏味。
我的问题是:在实践中如何进行辅助注射?有人有例子吗?我应该如何使用ImageModule
,如果有的话?
* - “不知何故”确实暗示它对我来说是部分魔法。
java - 使用带有多个相同类型参数的@Assisted 注入(@Named 参数)
我的问题归结为将@Assisted 与工厂的两个字符串参数一起使用。问题是因为Guice把type作为参数的识别机制,所以两个参数是一样的,我得到一个配置错误。
一些代码:
问题在于双字符串参数。
我尝试使用单独的 @Named("as proper") 注释标记每个字符串,但这只会导致更多配置错误。从这些错误的声音来看,他们不想在工厂类上绑定注释,所以我没有尝试自定义绑定注释。
简单而嘈杂的解决方案是创建一个简单的参数类来包含这三个辅助值,然后简单地注入:
这很有效,而且很可能没有错误,但很吵。摆脱嵌套静态类的某种方法会很好。
谢谢你的帮助!
guice - Guice 中的辅助注射
我想要一些关于使用辅助注射的建议。
我看到的大多数关于辅助注射的例子都有以下特点:
作为构造函数的类有一个参数,一个或多个仅在运行时出现的参数,即在构造时无法确定的参数,以及一个或多个在构造时已知的参数。因此,工厂的 create 方法只接受运行时提供的参数。
在我的情况下,90% 的时间,我只有运行时参数。意思是,我有一个需要 B 类的 A 类,但 B 采用只有 A 可以提供的参数。所以B的构造函数中只有@assister参数。
我想知道这是否是辅助注射的正确用法。
我的最后一个例子如下。A 需要返回一个作为 dataStructure 的类 B(有时称为 DTO 或值对象),因此我将必要的工厂传递给 A,以便在计算之后他可以返回 B。这里 B 就像一个容器类。我很少有这样的情况
..
另一种情况是服务 A 需要 B 服务,但 B 服务在创建时依赖于来自 A 的参数。然而,他自己将来自 A 的参数注入到 A 的地方,A 在用它创建 B 之前对其进行了一些初始化
.
特别是在最后一种情况下,我的目标是在 A 之外进行“A 的内部初始化”。
想法是在每个包中都有特定的创建模块,将那个包的“内部服务创建”外部化吗?
我这么说是因为我一直认为,在与将要使用的类/服务无关的地方创建东西对我来说听起来很奇怪。我并不是说我不坚持将用法与构造分开,而是我宁愿在类似的封闭类中这样做。不在一个完全不相关的地方。
根据我目前的理解,每个包都应该提供它的创建模块,该模块集中创建它包含的对象,尤其是在使用私有构造函数的情况下。
到目前为止,我已经使用 Guice 有一段时间了,但直到最近我才开始关注分离模块,并将模块与他们的包一起保存。我曾经在模块之间进行继承以链接对象的创建,并最终拥有一个从一开始就创建所有内容的模块。那是错的吧?
就是这样。我将不胜感激有关使用 Guice 的正确方法的一般性建议。我不确定我是否以正确的方式使用辅助注射。