带有限定符的 Dagger 依赖注入提供程序

Dagger Dependency Injection Provider with Qualifier

我想确认一下:如果两个提供商提供相同类型的实例,一个有限定符而另一个没有,这行得通吗?

// Existing provider
@Singleton
@Provides
static MetricsCollectorFactory provideMetricsCollectorFactory(){}

// New one to be added
@Singleton
@Provides
@VersionBasedMetricsCollectorFactory
static MetricsCollectorFactory provideVersionBasedMetricsCollectorFactory(){}

下面两种情况,尤其是TestClass1,Dagger会知道注入哪个MetricsCollectorFactory吗?

@Inject
TestClass1(MetricsCollectorFactory basicFactory)

@Inject
TestClass2(@VersionBasedMetricsCollectorFactory MetricsCollectorFactory basicFactory)

是的,与 Dagger dev guide 一样,每个键或绑定有零个或一个限定符实例,不存在与存在不同。

但是,从可读性的角度来看,您可能会考虑避免让两者共存——尤其是当您的团队不熟悉 Dagger 时。您的 @VersionBasedMetricsCollectorFactory MetricsCollectorFactory 可能最终会成为一个字段 metricsCollectorFactory,这可能会导致不熟悉的开发人员注入空 MetricsCollectorFactory 而不是所需的 @VersionBasedMetricsCollectorFactory MetricsCollectorFactory。相反,引入像 @Default MetricsCollectorFactory 这样的替代方案可能会有所帮助,或者至少会提供一个有用的编译错误,以鼓励更仔细地阅读注入密钥。