3

我正在尝试实现某种生产者工厂模式。
在注入派生类型时是否可以以某种方式触发基类型的生产者方法?

假设以下接口:

interface Service
interface AService extends Service

我想触发这个生产者:

@Produces
Service factory()

在这个注入点:

@Inject 
AService srv;

目的是通过添加标记接口(在本例中为服务)来为不同类型的服务提供一个生产者工厂。

谢谢你帮助我


更新:

我尝试了 LightGuards 解决方案并添加@Typed到 AService 实现中:

@Typed(Service.class)
class AServiceImplemenation implements AService 

不幸的是,我收到了一个不满意的依赖错误。CDI 不会为注入点调用Service生产者。AService当然,出于类型安全的原因,这是有道理的。但是有没有办法强制调用Service生产者?

4

2 回答 2

0

如果您只有超类型的生产者,并使其 AService 类型没有 no args ctor(或带有注释的 ctor @Inject),或者 is @Typed,或者在 CDI 1.1 中,您可以从您的生产者@Vetoed返回任何子类Service.

于 2013-06-19T16:43:17.747 回答
0

CDI 不允许生产者生产超类,它不会只为您找到合适的生产者

@Inject 
AService srv;

我遇到了同样的问题,我的解决方案是:

public class ServiceProxy<T> {
    private final T service;
    public ServiceProxy(T service) {
        this.service = service;
    }
    public T get() {
        return service;
    }
}

interface AService
//something

@Produces
@SomeQualifier
ServiceProxy factory(InjectionPoint ip) {
    Class<?> clazz = (Class<?>) ((ParameterizedType))ip.getType()).getActualTypeArguments()[0];
    //now we know actual service class and can produce one impl
}

@Inject
@SomeQualifier
ServiceProxy<AService> srv;
于 2016-03-14T06:51:24.370 回答