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。

现在的问题是如何绑定它,以便根据不同的对 E、D 提供 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 实现这种工厂?还是有更好的方法来做到这一点?

工厂的一个简单用例是:

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 回答
0

您可以使用Key.get(TypeLiteral<T> typeLiteral>来实现对实例的参数化绑定。

MyClass<MyType> myClassInstanceOfMyType = new MyClass<MyType>();    
bind(Key.get(new TypeLiteral<MyClass<MyType>>(){})).toInstance(myClassInstanceOfMyType);

然后在构造函数或基于成员的注入中使用 as:

class MyOtherClass {

  @Inject
  MyOtherClass(MyClass<MyType> myClass){}
  //stuff
}

或者

class MyOtherClass {

 @Inject
 MyClass<MyType> myClass;

}
于 2018-09-22T02:20:02.547 回答