在 Gradle 个模块中使用 Dagger Multibinding
Using Dagger Multibinding across Gradle modules
Fellow Dagger 用户...我是不是想做一些不可能的事情?下面是我的应用程序的 degraph 生成的 Gradle 模块视图。
假设我的应用有一个导航抽屉。我希望基于通过多重绑定填充的集合添加抽屉中的列表项。此多重绑定的贡献者跨越 > 1 Gradle 模块。
例如,从 user
模块中添加了一个名为 "Account" 的列表项,从 legal
模块中添加了一个名为 "Terms & Conditions" 的第二项,以及一个 "Search" 导航条目是从 search
Gradle 模块添加的。这些模块可以被认为是独立的应用程序,当捆绑在一起时形成完整的应用程序体验。它们可以自己运行。
关于此的 Dagger 文档看起来像是 Guice 的复制粘贴,但有一个很大的复杂性。它指出;
"Dagger allows you to bind several objects into a collection even when
the objects are bound in different modules using multibindings. "
...但这意味着 Dagger @Modules,对吧?是否可以跨 Gradle 个模块填充多重绑定?我已经尝试过类似的东西,但它不是我所期望的(并非所有的贡献都被收集);
父应用程序
@Module
abstract class PluginModule {
@Multibinds @NavigationContribution abstract Set<NavigationEntry> navigables();
}
legal
Gradle 包含 Dagger @Module
的模块
@Module
class LegalModule {
@Provides
@NavigationContribution
@IntoSet
static NavigationEntry provideLegalNavigation() {
return ...;
}
}
user
Gradle 包含 Dagger @Module
的模块
@Module
class AccountModule {
@Provides
@NavigationContribution
@IntoSet
static NavigationEntry provideAccountNavigation() {
return ...;
}
}
在运行应用程序上只有应用程序'context'下的贡献在调用时可用;
@Inject @NavigationContribution Set<NavigationEntry> navigationEntries();
可以访问其他贡献,但 'manually' 通过获取子 Gradle 模块的 dagger.Component
并公开一种方法来取回条目。
这违背了我的应用程序的 multibinder 的目的。这可能吗?如果不是,为什么?
更新:与 Jeff 进行分类
因此,顶级模块注释如下所示;
@ApplicationLifecycle
@Component(
modules = {
OceanLifeModule.class,
AddSpotActivityModule.class,
ModelModule.class,
PluginModule.class
},
dependencies = {
NavigationComponent.class,
LegalComponent.class,
PreferenceComponent.class,
DomainComponent.class
}
)
@jeff-bowman - 我在这里只缺少 PluginModule
上的 includes = {}
。 Zac Sweers 关于同一主题的博客 post here 为我指明了正确的方向。
Fellow Dagger 用户...我是不是想做一些不可能的事情?下面是我的应用程序的 degraph 生成的 Gradle 模块视图。
假设我的应用有一个导航抽屉。我希望基于通过多重绑定填充的集合添加抽屉中的列表项。此多重绑定的贡献者跨越 > 1 Gradle 模块。
例如,从 user
模块中添加了一个名为 "Account" 的列表项,从 legal
模块中添加了一个名为 "Terms & Conditions" 的第二项,以及一个 "Search" 导航条目是从 search
Gradle 模块添加的。这些模块可以被认为是独立的应用程序,当捆绑在一起时形成完整的应用程序体验。它们可以自己运行。
关于此的 Dagger 文档看起来像是 Guice 的复制粘贴,但有一个很大的复杂性。它指出;
"Dagger allows you to bind several objects into a collection even when the objects are bound in different modules using multibindings. "
...但这意味着 Dagger @Modules,对吧?是否可以跨 Gradle 个模块填充多重绑定?我已经尝试过类似的东西,但它不是我所期望的(并非所有的贡献都被收集);
父应用程序
@Module
abstract class PluginModule {
@Multibinds @NavigationContribution abstract Set<NavigationEntry> navigables();
}
legal
Gradle 包含 Dagger @Module
@Module
class LegalModule {
@Provides
@NavigationContribution
@IntoSet
static NavigationEntry provideLegalNavigation() {
return ...;
}
}
user
Gradle 包含 Dagger @Module
@Module
class AccountModule {
@Provides
@NavigationContribution
@IntoSet
static NavigationEntry provideAccountNavigation() {
return ...;
}
}
在运行应用程序上只有应用程序'context'下的贡献在调用时可用;
@Inject @NavigationContribution Set<NavigationEntry> navigationEntries();
可以访问其他贡献,但 'manually' 通过获取子 Gradle 模块的 dagger.Component
并公开一种方法来取回条目。
这违背了我的应用程序的 multibinder 的目的。这可能吗?如果不是,为什么?
更新:与 Jeff 进行分类
因此,顶级模块注释如下所示;
@ApplicationLifecycle
@Component(
modules = {
OceanLifeModule.class,
AddSpotActivityModule.class,
ModelModule.class,
PluginModule.class
},
dependencies = {
NavigationComponent.class,
LegalComponent.class,
PreferenceComponent.class,
DomainComponent.class
}
)
@jeff-bowman - 我在这里只缺少 PluginModule
上的 includes = {}
。 Zac Sweers 关于同一主题的博客 post here 为我指明了正确的方向。