2012-01-04 2 views
0

私はこのケースで自分の工場を使わないようにしようとしていましたが、Guiceを使ってこれを行う方法が見つからなかったかもしれません)Guiceでは、実装でジェネリックを使用するときに、パラメータ化されたクラスの複数のインスタンスをバインドする方法はありますか?

私は、タイプDへのE:私はマッパーを注入

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; 
} 

} 

注:今ドーザーや反射のビットを使用して

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

D serialize(E entity) throws MappingSerializationException; 

} 

、私はこのようになりますユニークなデフォルトクラスでこれを実装することができます。

ここで問題は、異なるペアのDefaultSerializationProviderの異なるインスタンスを提供するためにバインドする方法です。 私が避けたいのは、ジェネリックを定義する唯一の目的でサブクラスのホール束を作成することです。

私はのようにインスタンスのこの種を提供しています工場を提供することができます知っている純粋なJavaでは

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を実装するにはどうすればよいですか? これを行うにはより良い方法がありますか?工場の

簡単なユースケースは次のようになります。私の知る限り、すべての可能なタイプの引数にDefaultSerializationProviderをバインドする方法はありません知っているように、事前に

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

} 

おかげで、 ダニエル

答えて

2

:あなたが希望する場合、あなたは DefaultSerializationProviderにリテラルの種類を注入することにより toInstanceの使用を避けることができ

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

:あなたが変換する必要があり、すべての型引数を列挙することができた場合でも、あなたはこのようにバインディングを使用することができます

bind(new TypeLiteral<SerializationProvider<MessureUnit, MessureUnitDTO>>() {}) 
    .to(new TypeLiteral<DefaultSerializationProvider<MessureUnit, MessureUnitDTO>>() {}); 
@Inject public DefaultSerializationProvider(TypeLiteral<D> dtoType) { 
    this.dtoClass = (Class<D>) dtoType.getRawType(); 
} 

は、その後、あなたは次のようにバインディングを使用することができます

関連する問題