android - 从 Fragment 构建单个插入事件的正确方法

标签 android kotlin mvvm android-room clean-architecture

想象一下,我有一个简单的模态,其中呈现了静态数据。 该数据作为 Parcelable 参数传递给模态 fragment。当模式打开时,我想将其添加到 userHistory 数据库 中,这是一个简单的插入,我不期望任何类型的返回。

为了实现这个实现,我做了 ->

  • 呈现数据的 fragment

  • 将数据插入数据库的 DAO(带有 Room)

  • 调用 DAO 查询的存储库

但我有一个关于如何从 Fragment 调用 repository.insertPage 的内部问题。

将存储库引用添加到 fragment 中是否不好?

我应该创建一个 viewmodel 并仅使用一个函数来在调用存储库的 OnCreateView 上创建代理吗?

我应该创建一个调用存储库并引用 Fragment 上的 usecaseuseCase 吗?

老实说,我认为最好的方法是在 fragment 中引用存储库,但是我不知道这是否是一个糟糕的设计。

最佳答案

Is it bad add the repository reference into fragment?

您所描述的称为宽松的分层架构,其中依赖项可能会绕过较低层。 Simon Brown 在 Clean Architecture 一书中的第 34 章“缺失的章节”中对此进行了描述。

Relaxed layered architecture

罗伯特·C·马丁 (2017), Clean Architecture

与宽松分层架构相反的是严格分层架构,其中箭头应始终指向下一个相邻的较低层。

在某些情况下,可以绕过域层。但前提是两者之间没有业务逻辑。通常情况并非如此。通常你至少有验证逻辑。

Should I create a useCase that calls the repository and reference the usecase on Fragment?

在整洁的架构中,您通常将实体对象传递到存储库,而不是像 Parcelable 这样的请求对象。实体对象确保与应用程序无关的域规则。因此,您应该首先将数据(Parcelable)转换为实体对象,然后将它们传递到存储库。您通常在实现应用程序特定域规则的用例或交互器中执行此操作。

也许该用例的结果是它只是将数据转发到实体,然后转发到存储库。如果是这样,则意味着用例和实体中都没有域逻辑,甚至没有验证。这通常暗示您实现了贫乏的领域模型。在这种情况下,直接调用存储库可能就可以了。

但首先您应该尽最大努力维护架构。每一次绕过都是默认架构规则的异常(exception),因此使架构变得更加随意,从而削弱了架构。维护架构很困难,因为您必须抵制为特殊情况创建旁路。但如果异常(exception)是常态,您可能会使用错误的架构或以错误的方式应用它。

关于android - 从 Fragment 构建单个插入事件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71131890/

相关文章:

android - 为什么我无法以编程方式在 Android 中看到所有正在运行的应用程序?

android - 自动更新/在应用程序中添加一些文件

android - 无法在 XML .Android 工作室中更改按钮的背景颜色

java - Android 中的 AboutToQuit 信号/事件

c# - 绑定(bind)进度条可见性 mvvm 不起作用

wpf - MVVM WPF 数据绑定(bind)复选框不会针对选中和未选中状态向 ViewModel 触发事件

silverlight - MVVM 问题 - 仅绑定(bind)某些值

android - 从 Android Assets 打开 wav 文件时出现 FileNotFoundException

java ,正确使用静态变量来防止死锁——同步

kotlin - 在 kotlin 中更改重写函数参数的可空性