You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:06:04