需要重用的多步操作是否属于片段、视图模型、存储库或另一个 object/service?

Does a multi-step operation which needs to be reused belong in the fragment, the viewmodel, a repository, or another object/service?

我有一个简单的过程,需要在启动应用程序时完成(启动 fragment/view 模型),但还需要 运行 来自另一个片段(设置 fragment/view 模型) .它:

  1. 插入房间table
  2. 等待生成的 id
  3. 从数据库中获取新对象(因此它具有 createAt 日期时间)
  4. 将对象发送到 webapi

我很难理解将所有这些逻辑放在哪里。我倾向于在视图模型中而不是在片段中执行此操作,因此片段只需调用一次即可完成所有工作。可能我必须将一个侦听器合并到视图模型中,以便片段知道什么时候一切都完成了,或者是否有错误。这个地方看起来合适吗?

如果我这样做,我就有一个不同的设置片段视图模型。我不想重新创建初始视图模型的逻辑。那么我如何在视图模型之间共享这个逻辑呢?我是否将其推送到存储库中?

如果重要的话,我使用的是 Java 而不是 Kotlin。

首先,你绝对没有把它放在片段中是正确的,在现代 Android 开发中,Android 生命周期 类 应该始终保持尽可能精简。

一般来说,无论您使用何种架构,viewmodel 仍然是 view/presentation 层的一部分,如果可以避免,不应实现过多的业务逻辑。而存储库应该具有存储、检索和更新单个模型的单一职责,但如有必要,可以从多个源中获取。


因此,在回答您的问题时,视情况而定。如果您的所有步骤 1-4 都指的是关于同一模型的单个操作(可能有多个来源),那么我会说所有这些逻辑都应该保留在存储库中。

但是,如果您的步骤包括涉及与多个模型交互的领域逻辑,那么我建议将这项工作提交给您的领域层,可能以用例或类似的形式。如果这对您的应用程序来说似乎有点过分,那么虽然这不是最佳实践,但让共享视图模型(作用域为父片段或 activity)实现此逻辑是可以接受的。