Dagger:如何为同一interface绑定两个实现 调用接口方法同时触发两者执行
Dagger多实现同接口联动调用方案
实现思路
用组合模式+Dagger多绑定实现,不需要改动业务侧调用逻辑,就能做到一次接口调用触发所有实现的对应方法,完美适配多数据分析SDK上报场景。
具体实现步骤
- 第一步:定义通用上报接口
public interface AnalyticsReporter { void reportEvent(String eventName, Map<String, Object> params); }
- 第二步:实现各平台的上报逻辑
两个实现类都实现AnalyticsReporter接口,分别写对应SDK的上报代码,示例:
public class FirebaseReporter implements AnalyticsReporter { @Inject public FirebaseReporter() {} @Override public void reportEvent(String eventName, Map<String, Object> params) { // Firebase 上报逻辑 } } public class AdjustReporter implements AnalyticsReporter { @Inject public AdjustReporter() {} @Override public void reportEvent(String eventName, Map<String, Object> params) { // Adjust 上报逻辑 } }
- 第三步:编写组合代理类
同样实现AnalyticsReporter接口,内部持有所有上报实现的集合,遍历调用对应方法:
public class CompositeAnalyticsReporter implements AnalyticsReporter { private final List<AnalyticsReporter> delegateList; @Inject public CompositeAnalyticsReporter(Set<AnalyticsReporter> reporterSet) { this.delegateList = new ArrayList<>(reporterSet); // 若需要优先级,可在这里对reporterSet按自定义注解排序 } @Override public void reportEvent(String eventName, Map<String, Object> params) { for (AnalyticsReporter reporter : delegateList) { try { reporter.reportEvent(eventName, params); } catch (Exception e) { // 单个上报失败不影响其他上报,可按需加日志 } } } }
- 第四步:Dagger绑定配置
在Module中完成多绑定和代理绑定:
@Module public abstract class AnalyticsModule { // 将两个实现类绑定到Set集合中 @Binds @IntoSet abstract AnalyticsReporter provideFirebaseImpl(FirebaseReporter impl); @Binds @IntoSet abstract AnalyticsReporter provideAdjustImpl(AdjustReporter impl); // 将组合代理类绑定为对外暴露的AnalyticsReporter实现 @Binds abstract AnalyticsReporter provideReporter(CompositeAnalyticsReporter composite); }
使用方式
业务侧直接注入AnalyticsReporter实例,调用一次reportEvent方法就会自动触发两个SDK的上报逻辑:
// 注入实例 @Inject AnalyticsReporter analyticsReporter; // 业务调用 analyticsReporter.reportEvent("user_login", Collections.singletonMap("channel", "wechat"));
扩展说明
后续新增上报SDK时,只需要新增对应AnalyticsReporter实现类,在Module中加一条@Binds @IntoSet绑定即可,不需要修改原有业务代码和组合代理逻辑,符合开闭原则。
内容的提问来源于stack exchange,提问作者Miltent
相关产品推荐
相关产品推荐

