gpt4 book ai didi

android - 使用 Dagger2 提供不同的对象实例化

转载 作者:行者123 更新时间:2023-11-29 01:18:59 25 4
gpt4 key购买 nike

我在使用 Dagger2 时遇到以下问题:

我有一个 XML 序列化器,它接收一个格式、一个策略和一个匹配器。我的问题是格式可以是以下格式之一:

new Format()
new Format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")

我解决这个问题的方法是创建如下限定符接口(interface):

@Qualifier @Retention(RUNTIME) public @interface NoFormat {}

@Qualifier @Retention(RUNTIME) public @interface WithFormat {}

[Edit:] // @Qualifier @Retention(RUNTIME) public @interface FormatSerializer {} <- This was unecessary

[Edit:] // @Qualifier @Retention(RUNTIME) public @interface NoFormatSerializer {} <- This was unecessary

然后指定每个限定符的不同实现:

@Provides @Singleton @WithFormat Format provideWithFormat() {
return new Format(XML_PROLOG);
}

@Provides @Singleton @NoFormat Format provideNoFormat() {
return new Format();
}

@Provides @Singleton @WithFormat
Serializer provideFormattedSerializer(Strategy strategy, @WithFormat Format format,RegistryMatcher matcher) {
return new Persister(strategy, matcher, format);
}

@Provides @Singleton @NoFormat
Serializer provideNoFormatSerializer(Strategy strategy, @NoFormat Format format,RegistryMatcher matcher) {
return new Persister(strategy, matcher, format);
}

@Provides @Singleton
Retrofit provideRestAdapter(@WithFormat Serializer serializer) {}

@Provides @Singleton
XmlApiSerializer provideXmlApiSerializer(@NoFormat Serializer serializer) {}

这是正确的做法吗?我觉得太多了.. 我尝试了不同的方法,但我无法告知 dagger 他应该为每种情况使用哪种实现。这是我唯一的“成功”案例。

您对此有何看法?可以改进吗?怎么办?

编辑:我意识到我使用了 2 个不需要的限定符。现在我只有 withformat 和 noformat 限定符

最佳答案

可以通过委托(delegate)给单独的组件来创建相关对象的小图。以下是仅处理 FormatSerializer 的情况。

@Component(modules = {FormatModule.class, SerializerModule.class})
interface SerializerHelperComponent {
Serializer serializer();
}

@Module
final class FormatModule {
private final Format format;

FormatModule (Format format) {
this.format = format;
}

@Provides Format format() {
return format;
}
}

@Module
final class SerializerModule {
/** This @Provides method doesn't need the qualifier! */
@Provides static provideSerializer(
Strategy strategy,
Format format,
RegistryMatcher matcher) {
return new Persister(strategy, matcher, format);
}
}

现在,在您原来的 @Provides 方法中,您只需创建一个新的辅助组件,即可将所有内容与您选择的格式连接起来。

@Provides @Singleton @WithFormat
Serializer provideFormattedSerializer(
Strategy strategy,
Format format,
RegistryMatcher matcher) {
return DaggerSerializerHelperComponent.builder()
.formatModule(new FormatModule(return new Format())
.build()
.serializer();
}

只有一个绑定(bind),这绝对不值得麻烦,但如果为了获得输出而在辅助组件中创建一个复杂的图形,这可能是值得的。这绝对是一个判断电话。

关于android - 使用 Dagger2 提供不同的对象实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38011448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com