多个类实现同一接口时依赖注入如何同时调用不同实现的方法?
问题分析
你当前的设计没有违反依赖抽象的原则,问题只在于注入的依赖维度和业务需求不匹配:你需要同时调用多个接口实现的方法,但客户端类的构造函数只接收单个SomeInterface实例,自然只能触发单个实现的逻辑。
解决方案
方案1:注入所有实现类的集合(适合需要每次批量执行所有实现逻辑的场景)
主流DI框架均支持将同一接口的所有实现类自动注入为集合类型,你只需要修改客户端类的依赖声明即可:
class ClientClass { private List<SomeInterface> someInterfaceList; // DI容器会自动扫描并注入所有SomeInterface的实现类实例到该列表 public ClientClass(List<SomeInterface> someInterfaceList) { this.someInterfaceList = someInterfaceList; } public void testMethod() { // 遍历调用所有实现类的doSomething方法 someInterfaceList.forEach(SomeInterface::doSomething); } }
方案2:用策略工厂封装实现类(适合需要按需选择/混合调用实现的场景)
如果不是每次都要调用所有实现,而是可以根据业务逻辑选择调用一个或多个实现,你可以新增策略工厂类统一管理所有实现:
// 扩展原接口,新增实现类标识方法 interface SomeInterface{ // 返回当前实现的唯一标识 String getBizType(); void doSomething(); } // 实现类补充标识方法逻辑 class FirstClass implements SomeInterface{ @Override public String getBizType(){ return "FIRST"; } @Override public void doSomething(){ System.out.print("First class is doing something"); } } class SecondClass implements SomeInterface { @Override public String getBizType(){ return "SECOND"; } @Override public void doSomething() { System.out.print("Second class is doing something"); } } // 策略工厂类 class SomeInterfaceStrategyFactory { private final Map<String, SomeInterface> bizImplMap; // DI注入所有实现后,按标识存入Map public SomeInterfaceStrategyFactory(List<SomeInterface> allImpls) { this.bizImplMap = allImpls.stream() .collect(Collectors.toMap(SomeInterface::getBizType, Function.identity())); } // 对外提供根据标识获取实现的方法 public SomeInterface getByBizType(String bizType) { return bizImplMap.get(bizType); } }
之后客户端类注入SomeInterfaceStrategyFactory,需要调用哪个实现就通过标识获取,要同时调用两个就分别获取后执行对应方法即可。
内容的提问来源于stack exchange,提问作者Nem Jov
相关产品推荐
相关产品推荐

