From 2053cd7f05b987473b74b2269264749473296c49 Mon Sep 17 00:00:00 2001 From: appflowy Date: Sun, 20 Jun 2021 23:35:21 +0800 Subject: [PATCH] update README with DDD Event flow --- .gitignore | 3 ++ .idea/appflowy_client.iml | 2 ++ doc/architecture.md | 74 +++++++++++++++++++++++++++++---------- 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 088ba6ba7d..67f6890827 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk + +/rust-lib/flowy-ast +/rust-lib/flowy-derive \ No newline at end of file diff --git a/.idea/appflowy_client.iml b/.idea/appflowy_client.iml index 3d6231c1bd..366f01032b 100644 --- a/.idea/appflowy_client.iml +++ b/.idea/appflowy_client.iml @@ -2,6 +2,7 @@ + @@ -26,6 +27,7 @@ + diff --git a/doc/architecture.md b/doc/architecture.md index 71f97e649d..1575f42a54 100644 --- a/doc/architecture.md +++ b/doc/architecture.md @@ -167,27 +167,65 @@ The AppFlowy Client consists of lots of modules. Each of them follows the DDD de to communication with other module. ``` - Client - ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ - │ │ - │ User Editor Setting │ - │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ - │ │ presentation │ Dependency │ presentation │ │ presentation │ │ - │ │ │ Injection │ │ │ │ │ - │ │ application ├───────────────▶│ application │ │ application │ │ - │ │ │◀───────────────│ │ │ │ ◉ ◉ ◉ │ - │ │ domain │ │ domain │ │ domain │ │ - │ │ │ │ │ │ │ │ - │ │ Infrastructure │ │ Infrastructure │ │ Infrastructure │ │ - │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ - │ ▲ │ │ - │ │ Dependency Injection │ │ - │ └─────────────────────────────────────────────────────────────┘ │ - │ │ - └──────────────────────────────────────────────────────────────────────────────────────────────────────┘ + + Client + ┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐ + │ │ + │ Module A Module B Module C │ + │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ + │ │ presentation │ Dependency │ presentation │ │ presentation │ │ + │ │ │ Injection │ │ │ │ │ + │ │ application ├───────────────▶│ application │ │ application │ │ + │ │ │◀───────────────│ │ │ │ ◉ ◉ ◉ │ + │ │ domain │ │ domain │ │ domain │ │ + │ │ │ │ │ │ │ │ + │ │ Infrastructure │ │ Infrastructure │ │ Infrastructure │ │ + │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ + │ ▲ │ │ + │ │ Dependency Injection │ │ + │ └─────────────────────────────────────────────────────────────┘ │ + │ │ + └──────────────────────────────────────────────────────────────────────────────────────────────────────┘ ``` Let's dig it how can I construct each module. I take `User` module for demonstration. +``` + presentation Application domain Infrastructure + + │ + │ │ + 7 Data Model + ┌──────────────────────────────┐ │ ┌────────────────────────┐ │ ┌───────────────────────────┐ + │ │ │ │ ┌─────────────┐ │ ┌─────▶│ Repository implementation │ + ▼ Bloc │ 2.1 │ │ Aggregate │ │ │ │ └───────────────────────────┘ +┌─────────────┐ │ ┌─────────────────┴─────┐ │ └─────────────┘ │ │ │ 4 +│ Widget │ │ ┌────────┐ ┌────────┐ │ │ │ ┌────────┐ │ │ │ ▼ +└─────────────┘ │ │ │ Event │ │ State │ │───┬────▶│ │ Entity │ │ │ ┌─────────────────────┐ + │ │ └────────┘ └────────┘ │ │ │ │ └────────┘ │ │ │ │ Unit of Work │ + │ │ └──────▲────────────────┘ │ │ ┌─────────────────┐ │ │ └─────────────────────┘ + │ │ │ │ │ │ Value Object │ │ │ │ │ 5 + └──────────┼────────┘ │ │ └─────────────────┘ │ │ ▼ + 1 │ │ └────────────────────────┘ │ │ ┌─────────────────────┐ + │ │ ◈ │ │ Persistence Service │ + │ │ │ contain │ │ └─────────────────────┘ + │ │ ┌────────────────────┐ │ + │ │ │ Service │ │ │ + │ │ └────────────────────┘ │ + │ 2.2 │ │ + │ │ ┌───────────────────────┐ │ + │ └───▶│ Repository interface │ │ │ + │ └───────────────────────┘ │ + │ │ │ │ + │ │ 3 │ + │ └───────────────┼──┘ +``` + + +1. Send event using the bloc. The bloc does not know about the `Widget`. It should communicate through events. +2. The bloc dispatching the event to the appropriate handler of the `Domain` + 1. Conversion between, DTO (Data Transfer Object) to domain model and Domain Model to DTO. + 2. Handling the business logic using the repository interface +3. Repository are used to store the domain model data and calls respective service to finish the jobs. # Event-Driven \ No newline at end of file