多模块应用程序中FeatureComponent存储在哪里?

问题描述 投票:0回答:1

我有几个功能模块。它们每个都包含三个模块::domain、:data 和:ui。所以我的问题是我应该在哪里存储FeatureComponent?显然,我将需要它用于所有三个层模块,例如将用例注入视图模型,将 api 注入存储库等。但是在哪里存储这个FeatureComponent呢?或者我应该只创建三个组件,每个组件一层?这里最好的方法是什么?

我认为将其存储在域模块中是一个好主意,但显然不是,因为这样我可能会面临一些依赖于 android 框架的域问题。有什么想法吗?

android architecture dagger-2
1个回答
0
投票

我认为匕首组件应该由负责其生命周期的任何实例存储。

例如: 应用程序类负责应用程序范围(或单例)匕首组件的生命周期。

大多数存储库都应该贡献给这个应用程序范围的匕首组件,因为您可能希望它们是单例的。

然后,对于功能范围的匕首组件,其生命周期可以由活动管理,因此活动存储该组件并将其公开给片段,以便它们可以注入其视图模型。一个旁注是,当启用终止活动并进出您的应用程序时,这种方法有点冒险,将创建一个新活动,因此可能还会创建一个新的功能范围匕首组件,但这可能不是什么你要。 (我们通过重写 onSaveInstanceState 解决了这个问题,并使用它在应用程序中缓存功能范围的 dagger 组件,并使用我们存储在包中的标识符在活动的 onCreate 中恢复它)

我们的例子是一个应用程序范围,其组件由 Application 类管理。

然后我们有一个环境范围,其组件由自定义环境存储库(作为应用程序范围组件中的单例驻留)管理。这个EnvironmentRepository负责提供环境dagger组件。切换环境(例如从验收到生产)非常简单,因为所有特定于环境的配置值都由环境存储库安装在环境组件中。

我们对用户范围的依赖项执行相同的技巧,有一个 UserRepository (安装在环境范围的组件中),它可以让我们轻松切换用户。

所有用于数据持久化的代码都是在 dagger 组件的各层中提供的,因此当您编写一些 CustomerDataRepository 并希望持久化结果时,您可以注入一个 UserScoped 共享首选项实例,这样它就不会与用户数据发生冲突为其他用户或其他环境存储。

我还建议你看看Anvil(我与它没有任何关系),它使得组织组件、子组件、模块,为多模块应用程序中的正确(子)组件做出贡献变得轻而易举。

© www.soinside.com 2019 - 2024. All rights reserved.