问题标签 [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.

0 投票
1 回答
208 浏览

java - @Assisted \ @Provider 在层次设计中对象创建中的使用

这个问题是关于正确使用 Guice @Assisted 和 @Provides 以及如何做到这一点。

我指的当前设计是这样的:层次结构顶部的类也是唯一暴露给客户端的类(基本上是公共 API),它看起来像这样:

正如您可能理解的那样, id 由用户在创建时提供(@Assisted?)但其他不是,它们只是工厂。

Manager创建Shift类的实例。Shift类创建Worker类的实例。

现在,为了创建Shift类,我们使用它的构造函数:

Manager提供的shiftId和其余的是来自Manager的构造函数的相同对象。

为了创建Worker,我们使用 2 个静态工厂方法(但可以更改..):

Shift类提供的workerId 。其余的由Shift构造函数委托。

什么是正确的 Guice-y 方法?我应该把@Assisted放在哪里?@提供?

我真的很想要一个代码示例,包括抽象模块,因为到目前为止我看到的代码示例对我来说还不能理解。

谢谢

0 投票
1 回答
1584 浏览

java - Guice - 绑定由辅助注入工厂创建的实例

假设有一个类 A 的构造函数看起来像这样:

还有AFactory:

因此,要创建一个 AI 实例显然需要执行以下操作:

但是,假设我有其他类:B 类、C 类和 D 类具有类型 A 的成员,例如(具有字段注入但也可以是 ctor):

我希望将相同的 A 实例注入到这些类中。但是仍然可以选择将 A 的另一个实例注入其他类(比如说 E 类和 F 类)。

这样做的正确方法是什么?我只是想不出一个干净的方法来做到这一点。

0 投票
1 回答
1008 浏览

java - 已在 TesterFactory.create() 中配置了与带有 @com.google.inject.assistedinject.Assisted(value=) 注释的 java.lang.String 的绑定

我的 TesterResource 类有 2 个成员:

但是,当我构建代码时,我收到一个错误 A binding to java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) is already configured at TesterFactory.create()。如果我只为 serviceName 保留 @Assisted,我不会收到此错误。

0 投票
1 回答
2143 浏览

java - 使用多个构造函数的 Guice 辅助注入始终调用默认构造函数

我有一个有两个构造函数的类。我正在尝试使用 guice 工厂创建此类的实例。如果没有传递参数,则应调用默认构造函数。如果传递了参数,则应调用带参数的构造函数。但是目前即使我将参数传递给工厂方法,仍然会调用默认构造函数。带参数的构造函数根本没有被调用。下面是我的工厂课。

下面是我试图注入的构造函数。

下面是我在抽象模块实现类中的模块绑定。

下面是我如何调用构造函数。

我在这里做错了什么?任何帮助将非常感激。

编辑:

请注意,JsonMapperImpl 类没有构造函数。它只有一个公共方法,仅此而已。

0 投票
1 回答
429 浏览

dependency-injection - 在 Guice 中使用 AssistedInject Factory 创建对象

我有一个应该以两种不同方式注入的类:

  1. 通用作为单例

  2. 自定义版本为 RequestScoped。

例子:

假设每个人都可以使用通用对象并竞争 performTask 操作(因为它是同步的),或者他们可以投资并创建自己的实例/实例。

出于一般目的,我创建了界面

和绑定:

对于定制版本,我创建了工厂

并安装它:

我已经尝试过了,它在运行时工作(我希望我没有在手动编写上面的代码时出错),但是我不确定它是否完全按照我的意愿工作,因为我只是写了它并且没有时间对其进行全面测试。

但后来我意识到我不知道工厂是如何运作的。对于不同的用户('userId'),它应该创建不同的实例,但是相同的 userId 呢?假设某个 John Doe 想要创建 3 个 TaskProcessorService 实例,工厂是否会为每个调用创建 3 个不同的实例(假设参数相同 - john doe 的 ID)?

这是主要问题,即使对于具有相同参数的调用,工厂是否总是创建新对象?在文档中找不到任何关于它的证据,而且我不能 100% 确定是否没有创建某些缓存机制。

第二个问题,它是问题的最佳解决方案吗?

0 投票
0 回答
194 浏览

java - 注释辅助注塑厂

没有AssistedInjection,我有以下

但是要使用 AssistedInjection,我需要

B和的相应变化C

这有两个问题:

  1. 应用程序代码必须了解是调用createB还是createC
  2. 跨越我的UberFactory包结构以实例化IA

在我看来,更直观的 API 将是:

这样我就可以简单地注释IAFactory我注入到我的应用程序代码中的实例。

但据我所知,没有这样的 API。所以,

  1. 有什么我遗漏的东西使这样的 API 不合理吗?
  2. 鉴于当前可用的功能,有没有办法近似这种行为?
0 投票
1 回答
1920 浏览

java - Guice 辅助注射

我是 Guice 的新手,所以我想了解 AssistedInject。我有一个非常简单的项目:

我要注入的类:

辅助注射类:

工厂

主要课程:

但它仍然不起作用,我不明白,我错在哪里?

0 投票
0 回答
133 浏览

java - Guice 范围和 AssistedInject

我有使用 AssistedInject 来创建我的类的工厂的代码。现在我想做的是创建许多对象,每个对象都被注入集合的不同项目(可以说反向多重绑定)。

我的方法是使用包含迭代器的自定义范围来提供项目,但我做错了:

IterationScope.java:

IterationScoped.java:

在模块中:

我尝试获得这样的值:

并像这样设置范围:

我遇到的问题是,在创建工厂时,我在 IteratorScope.scope 中得到了 NullPointerException,因为没有设置 Iterator。

我的期望是,工厂仅在我实际请求对象时才尝试查找作用域提供程序,而不是在创建工厂时。有没有办法解决这个问题?我有一个丑陋的想法,涉及一个带有递增计数器的范围提供程序,以便选择集合的正确项目,但我想要一种更简洁的方法。

0 投票
0 回答
179 浏览

jakarta-ee - CDI - 如何注入非托管依赖项,如 Guice 的 Assisted Inject

Guice 有一个很好的扩展名为AssitedInject。有没有办法在 Java EE 中使用 CDI 实现自动装配工厂?我希望能够获得具有托管和非托管依赖项的托管实例。

想象一个类似命令模式的实现:

使用 Guice,我将能够创建一个提供实例的工厂:

我需要添加@AssitedSomeCommands 构造函数参数model并注册CommandFactory到注入器:

SomeCommand鉴于SomeModel无法管理,我如何通过 CDI 获取实例。有没有类似的方法来创建像 Guice 这样的自动布线工厂?

0 投票
1 回答
1011 浏览

java - guice 辅助注入 + 多重绑定 + 泛型

我正在尝试结合 Guice 的这 3 个特性:注入、多重绑定、泛型。我创建了一个生产项目的原型,所以这里是:

首先,这是泛型的一个小层次结构(在生产情况下,有 N 个实体的层次结构):

接下来,我想通过Factory创建的类ToCreate1ToCreate2

基类:

继承人:

然后,工厂本身:

所以,现在我想注入一张地图,其中包含Factory<Type1>Factory<Type2>以分别创建ToInject1ToInject2

所以,我用 configure 方法创建了 Guice 的AbstractModule :

所以,我注入它@Inject public Map<String, Factory> map;,一切都好:

正如我之前提到的,我的生产系统中有更多的类型,所以AbstractModule变得过于繁琐。我尽量避免重复代码和修改配置方法:

而且它不起作用!古斯 说:

怎么了?