docs(standards): align layering docs with the port seam; split runtime vs wiring diagrams
This commit is contained in:
@@ -17,9 +17,9 @@ flowchart LR
|
||||
RT["<resource>/routes.py<br/>thin handlers"]
|
||||
end
|
||||
|
||||
subgraph CORE["domain/ — pure business core"]
|
||||
subgraph CORE["domain/ — business core"]
|
||||
MD["models"]
|
||||
PT["ports (abstract)"]
|
||||
PT["ports (adapter binding seam)"]
|
||||
SV["services"]
|
||||
end
|
||||
|
||||
@@ -44,11 +44,11 @@ flowchart LR
|
||||
```
|
||||
|
||||
The rule holds at every edge: code in an outer ring may depend on a ring closer
|
||||
to the core, never the reverse. `domain/` never imports a web framework or a
|
||||
database driver.
|
||||
to the core, never the reverse. `domain/` never imports a web framework;
|
||||
only its `ports/` seam reaches into `infra/` to bind adapters.
|
||||
|
||||
> **Legend** — solid arrows are compile-time calls; dotted arrows are the
|
||||
> port/adapter contract, resolved by the composition root at startup.
|
||||
> port/adapter binding, performed by the composition root at startup.
|
||||
|
||||
---
|
||||
|
||||
@@ -57,7 +57,7 @@ database driver.
|
||||
| Ring | May import | Never imports |
|
||||
|-------------|------------------------------------|----------------------------------|
|
||||
| `interfaces/` | `domain`, framework glue (glue only) | business logic, `infra` directly |
|
||||
| `domain/` | nothing but its own ports | web frameworks, drivers, `infra` |
|
||||
| `domain/` | its own models + its `ports/` seam (which binds `infra`/libraries) | web frameworks, `interfaces/` |
|
||||
| `infra/` | `domain` ports, drivers, libraries | — |
|
||||
| `init.py` | everything (the wiring point) | — |
|
||||
|
||||
@@ -67,8 +67,9 @@ database driver.
|
||||
|
||||
1. **One-way dependencies.** `interfaces -> domain -> infra` is allowed; the
|
||||
reverse is forbidden.
|
||||
2. **Ports in the domain, adapters in infra.** A service depends on an abstract
|
||||
port; the composition root injects a concrete adapter.
|
||||
2. **Ports in the domain, adapters in infra.** A service depends on a port; the
|
||||
port's factory binds the concrete adapter, and the composition root calls
|
||||
those factories.
|
||||
3. **One composition root.** Nothing constructs its own dependencies. All
|
||||
wiring lives in one module (`init.py`) exposed as a flat resource registry.
|
||||
4. **Spec-first.** The HTTP contract is declared in `openapi.yaml`; route
|
||||
|
||||
Reference in New Issue
Block a user