0

この場合、私は自分の工場の使用を避けようとしていましたが、おそらく私が Guice を初めて使用したため、Guice でこれを行う方法を見つけることができませんでした ;)

タイプ E をタイプ D に変換するこのインターフェースがあります。

public interface SerializationProvider<E extends ValueEntity, D extends ModelDTO> {

D serialize(E entity) throws MappingSerializationException;

}

Dozer と少しのリフレクションを使用すると、次のような独自の Default クラスでこれを実装できます。

public class DefaultSerializationProvider<E extends ValueEntity, D extends ModelDTO>          implements
    SerializationProvider<E, D> {
private Mapper mapper;
private Class<D> dtoClass;

@Inject
public DefaultSerializationProvider(Class<D> dtoClass){
    this.dtoClass=dtoClass;
}

@Override
public D serialize(E entity) throws MappingSerializationException {
    D result=this.getNewDTOInstance();
    this.mapper.map(entity, result);
    return result;
}

protected D getNewDTOInstance() throws MappingSerializationException {
    try{
        D result=this.dtoClass.newInstance();
        return result;
    }catch(InvocationException ie){
        throw new MappingSerializationException(ie);
    }catch(IllegalAccessException iae){
        throw new MappingSerializationException(iae);
    }catch(InstantiationException iie){
        throw new MappingSerializationException(iie);
    }
}

@Inject
public void setMapper(Mapper mapper) {
    this.mapper = mapper;
}

}

Mapper を注入することに注意してください。

問題は、さまざまなペアに応じて DefaultSerializationProvider のさまざまなインスタンスを提供するために、これをどのようにバインドできるかということです。

純粋な Java では、次のようなインスタンスを提供する Factory を提供できることを知っています。

public interface SerializationProviderFactory {

public <E extends ValueEntity, D extends ModelDTO> SerializationProvider<E,D> get(Class<E> entityType, Class<D> dtoType);

}

これの非常に単純な実装は次のようになります。

public class DefaultSerializationProviderFactory implements
    SerializationProviderFactory {
public static final DefaultSerializationProviderFactory INSTANCE=new  DefaultSerializationProviderFactory();

@Override
public <E extends ValueEntity, D extends ModelDTO> SerializationProvider<E, D> get(
        Class<E> entityType, Class<D> dtoType) {
    return new DefaultSerializationProvider<E, D>(dtoType);
}

}

ここで問題は、Guice を使用してこの種の Factory をどのように実装できるかということです。または、これを行うより良い方法はありますか?

Factory の簡単な使用例は次のとおりです。

public MessureUnitDTO serializeUnit(MessureUnit unit){
    SerializationProviderFactory factory=DefaultSerializationProviderFactory.INSTANCE;
    SerializationProvider<MessureUnit, MessureUnitDTO> provider=factory.get(MessureUnit.class, MessureUnitDTO.class);
    return provider.serialize(unit);

}

前もって感謝します、ダニエル

4

2 に答える 2

4

私の知る限り、DefaultSerializationProvider可能なすべての型引数をバインドする方法はありません。ただし、変換する必要があるすべての型引数を列挙できる場合は、次のようなバインディングを使用できます。

bind(new TypeLiteral<SerializationProvider<MessureUnit, MessureUnitDTO>>() {})
    .toInstance(new DefaultSerializationProvider<MessureUnit, MessureUnitDTO>(MessureUnitDTO.class));

toInstance必要に応じて、型リテラルを に挿入することで使用を避けることができますDefaultSerializationProvider

@Inject public DefaultSerializationProvider(TypeLiteral<D> dtoType) {
  this.dtoClass = (Class<D>) dtoType.getRawType();
}

次に、次のようなバインディングを使用できます。

bind(new TypeLiteral<SerializationProvider<MessureUnit, MessureUnitDTO>>() {})
    .to(new TypeLiteral<DefaultSerializationProvider<MessureUnit, MessureUnitDTO>>() {});
于 2012-01-04T22:17:19.800 に答える