java - 使用 Guice 在实现使用泛型时如何绑定(bind)参数化类的多个实例?

标签 java inversion-of-control guice factories

在这种情况下,我试图避免使用自己的工厂,但我找不到使用 Guice 的方法,也许是因为我是新使用 guice ;)

我有这个接口(interface)可以将类型 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;
}

}

请注意,我注入(inject)了映射器。

现在的问题是如何绑定(bind)它,以便根据不同的 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);

}

提前致谢, 丹尼尔

最佳答案

据我所知,没有办法为所有可能的类型参数绑定(bind) DefaultSerializationProvider。但是,如果您可以枚举需要转换的所有类型参数,则可以使用如下绑定(bind):

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

如果您愿意,可以通过将类型文字注入(inject) DefaultSerializationProvider 来避免使用 toInstance:

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

然后你可以使用这样的绑定(bind):

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

关于java - 使用 Guice 在实现使用泛型时如何绑定(bind)参数化类的多个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8729952/

相关文章:

java - Gin 或 Guice 的 singleton 和 eagersingleton 之间的区别?

java - 向 Guice 模块添加新绑定(bind)?

java - 如何从数据库中选择列表中的特定条目?

java - Jacoco ant 任务 - 没有 jacoco.exec 输出

c# - 统一配置和相同装配

c# - 为 .NET 库找到正确的组合根

java - Guice TypeListener 未收到有关注入(inject)类 Type 的通知

java - 将 Arraylist<子类> 转换为 ArrayList<父类>

java - 从不同的类调用数组 - Java

inversion-of-control - 在 Nancy 项目中获取 TinyIoc 当前容器