我遇到Dagger2的问题如下:
我有一个XML Serializer,它接收格式,策略和匹配器。我的问题是格式可以是以下之一:
new Format()
new Format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")
我解决此问题的方法是创建Qualifier接口,如下所示:
@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) {}
这是正确的做法吗?我觉得这太过分了......我尝试了不同的方法,但我从来没有告诉匕首他应该为每个案例使用哪种实施方式。这是我唯一的“成功”案例。
您对此有何看法?可以改进吗?怎么样?
编辑:我意识到我正在使用不需要的2个限定符。现在我只有withformat和noformat限定符
答案 0 :(得分:1)
您可以通过委派给不同的组件来创建相关对象的小图。以下是处理Format
和Serializer
。
@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();
}
只有一个绑定,这绝对不值得麻烦,但如果有一个复杂的图形将在助手组件中创建以获得输出,那么它可能是值得的。这绝对是一种判断。