如何在没有通用接口的情况下注入特定类的所有子类?

时间:2018-06-20 14:40:46

标签: java dependency-injection dozer

问题:

为了Inject没有公共接口的超类的所有子类,我创建了一个与所述超类紧密耦合的接口,每个“正确”编写的子类都应实现。 这有效,但似乎很疯狂。有更好的方法吗?

简单的强制转换不起作用,因为Instance仅包含一个代理,该代理在被调用时不解析为接口的任何实际子类。这样就产生了ClassCastException

某些上下文:

我最近受命为应用程序提供框架代码。在此应用程序中,几个数据传输对象正在和服务级别POJO之间进行映射,但是它们的映射并不总是那么简单。推土机用于完成大部分工作并避免样板代码。

在需要显式映射指令的特定情况下,Dozer当前的建议是使用API​​驱动的映射。初始化后,所有定义映射的BeanMappingBuilder子类都应添加到Dozer映射器中。

为了将添加新BeanMappingBuilder所需的所有工作都放在一个地方,我进行了复杂的依赖注入,尽管没有通用接口,但依赖注入会自动将其添加到Dozer映射器中,只是与其他人共同的超类。

某些代码:

界面:

@Local
public interface DtoBeanMappingBuilder {

    BeanMappingBuilder get();

}

子类示例:

@Stateless
public class SomeDtoMappingBuilder extends BeanMappingBuilder implements DtoBeanMappingBuilder {

    @Override
    public BeanMappingBuilder get() {
        return this;
    }

    @Override
    protected void configure() {
        mapping(
            // Some mapping...
        );
    }

}

具有注入点的映射器:

@Singleton
@Startup
public class DtoBeanMapper {

    private DozerBeanMapper innerMapper;

    @Inject
    @Any
    private Instance<DtoBeanMappingBuilder> mappingBuilders;

    public <D> D map(Object source, Class<D> destinationClass) {
        return innerMapper.map(source, destinationClass);
    }

    @PostConstruct
    private void init() {
        innerMapper = new DozerBeanMapper();
        mappingBuilders.forEach(mb -> innerMapper.addMapping(mb.get()));
    }
}

0 个答案:

没有答案