type
status
date
slug
summary
tags
category
icon
password
在本系列的前 5 部分中,您学习了 Clean Architecture 的一些核心概念,通过这些概念,我们在项目中创建了许多文件夹,并且我们还构建了 Instagram 应用程序漂亮的 UI。我们还在项目的 .yaml 文件中添加了一些包,我们将在整个项目中使用这些包。
<ins/>
现在我们将从域层开始,它是最内层和独立的层,它不会包含任何类型的具体实现,但会有我们的核心合约或抽象类,稍后这些将在数据层中实现。
Entity
我们的业务对象的实体,什么样的数据将存储在我们的 Cloud Firestore 数据库中?首先,我们将有一个 User,然后我们将在我们的应用程序中对该用户进行身份验证,但是......我们的 User/UserEntity 将保存什么样的内容?嗯,用户的基本数据是用户名、电子邮件、密码等。但是在我们的例子中,如果你查看下面的 Profile Page 或 Edit Profile Page,在你的 domain > entities > 中创建一个目录,并将其命名为 user,并在其中创建一个 dart 文件 user_entity.dart。
user_entity.dart
我们使用 Equatable 扩展了我们的 UserEntity 类,这是一个用于值相等的包,您可以查看其文档。
<ins/>
Use Cases
这些用例是我们执行业务逻辑的地方,正如我所说,在 Bloc 的 Cubit(状态管理解决方案)子集的情况下,这不会包含那么多逻辑,但这会将其工作委托给用例,在这里,用例将从 Repository(Contract) 类获取数据。
Repository
如果您还记得第 1 部分,那么我们在那里了解了完整的 Clean Architecture 结构,您可能肯定熟悉上图,用例是从存储库获取数据,它们用例和存储库(合同)都将在数据层中实现。
您期待什么?就像我们的合同会是什么样子吗?就像在这部分一样,我们只为 User 编写代码,所以我们现在将拥有 User 的所有方法,以后还会有更多的方法用于其他逻辑,如 Post、Comment 等,在你的 domain > repository 中创建一个 dart 文件并将其命名为 firebase_repository.dart。
firebase_repository.dart
现在您可能在想我们的用例会是什么样子?首先转到 > domain > usecases > 并创建一个目录用户,因为那里会包含用户的所有用例,然后根据我们的存储库(合约)类中的方法开始创建 .dart 文件,对于每个方法,将有单独的用例,例如:
sign_in_user_usecase.dart
我们有一个单独的类,我们获取 FirebaseRepository 的实例作为存储库,然后创建一个 call() 方法,它的返回类型将根据特定方法的返回类型,就像在 Repository(合约)类中一样,signInUser 的返回类型是 Future<void>,所以这里方法的返回类型是相同的,参数也会相应地,如果它接受 String uid,那么传递 String uid作为参数,或者如果它接受 UserEntity,则根据 this 传递它,或者如果它不接受任何,则将其留空。
另一个用例示例:
get_current_uid_usecase.dart
所以最后我们的 Domain files Structure 看起来像这样:
结论
我们已经完成了域层的用户部分,在下一篇文章中,我们将转到数据层,我们将在其中实现域层中的合约类,以及我们在存储库(合约)类和用户模型中创建的方法