3

ある種のプロデューサーファクトリーパターンを実装しようとしています。
派生型を注入しているときに、基本型のプロデューサー メソッドをトリガーすることは何とか可能ですか?

次のインターフェイスを想定しています。

interface Service
interface AService extends Service

このプロデューサーをトリガーしたい:

@Produces
Service factory()

この注入ポイント:

@Inject 
AService srv;

目的は、マーカー インターフェイス (この場合はサービス) を追加することで、さまざまな種類のサービスに対して 1 つのプロデューサー ファクトリを用意することです。

私を助けてくれてありがとう


アップデート:

LightGuards ソリューションを試し@Typed、AService 実装に追加しました。

@Typed(Service.class)
class AServiceImplemenation implements AService 

残念ながら、満たされていない依存関係のエラーが発生します。CDIは、注入ポイントのServiceプロデューサーを呼び出しません。AService確かに、これは型安全性の理由から理にかなっています。Serviceしかし、プロデューサーの呼び出しを強制する方法はありますか?

4

2 に答える 2

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 に答える