Files
slm-design/DRAFT/level-3/domains/framework-bindings.md

72 lines
3.0 KiB
Markdown
Raw Normal View History

2026-07-30 13:22:45 +03:00
# React module внутри Domain
2026-07-30 13:22:45 +03:00
> Пояснение framework boundary Domain на примере React.
2026-07-30 13:22:45 +03:00
## Связанные правила
2026-07-30 13:22:45 +03:00
- [`SLM-L3-FRAMEWORK-R013`](../../rules/level-3.md#slm-l3-framework-r013)
- [`SLM-L3-BUSINESS-A004`](../../rules/level-3.md#slm-l3-business-a004)
- [`SLM-L3-ASSEMBLY-R010`](../../rules/level-3.md#slm-l3-assembly-r010)
2026-07-30 13:22:45 +03:00
## Имя и место module
2026-07-30 13:22:45 +03:00
Framework-specific module находится непосредственно в Domain и называется именем framework:
```text
2026-07-30 13:22:45 +03:00
domains/auth/react/
├── components/
2026-07-30 13:22:45 +03:00
├── hooks/
├── providers/
├── types/
└── index.ts
```
2026-07-30 13:22:45 +03:00
`react` точно обозначает framework и не создаёт пустую промежуточную Group вроде `framework/react` или `bindings/react`. Если Domain действительно поддерживает другой framework, он получает отдельный sibling module, например `vue`.
2026-07-30 13:22:45 +03:00
## Роль React module
2026-07-30 13:22:45 +03:00
React module может:
2026-07-30 13:22:45 +03:00
- передать готовый `AuthApi` через context/provider;
- создать hook доступа к API или framework-neutral state;
- связать React lifecycle с subscription API;
- реализовать domain-specific React component.
2026-07-30 13:22:45 +03:00
Он не меняет business rules, не создаёт domain errors, не выбирает concrete adapters и не вызывает factory или preset. Сборка остаётся у composition graph owner; React module получает уже готовый instance.
2026-07-30 13:22:45 +03:00
```tsx
type AuthProviderProps = PropsWithChildren<{
api: AuthApi
}>
2026-07-30 13:22:45 +03:00
export const AuthProvider = ({ api, children }: AuthProviderProps) => {
return <AuthContext.Provider value={api}>{children}</AuthContext.Provider>
}
```
2026-07-30 13:22:45 +03:00
## Reactive state
2026-07-30 13:22:45 +03:00
Если `AuthApi` предоставляет framework-neutral protocol `getSnapshot` и `subscribe`, React module может использовать `useSyncExternalStore`:
2026-07-30 13:22:45 +03:00
```tsx
'use client'
2026-07-30 13:22:45 +03:00
export const useAuthState = () => {
const api = useAuth()
2026-07-30 13:22:45 +03:00
return useSyncExternalStore(
api.subscribe,
api.getSnapshot,
api.getSnapshot,
)
}
```
2026-07-30 13:22:45 +03:00
Business не импортирует React и не возвращает React hook как единственный способ наблюдать state. React module не создаёт subscription до commit и возвращает cleanup через protocol `useSyncExternalStore`.
2026-07-30 13:22:45 +03:00
## Domain UI и compositions
2026-07-30 13:22:45 +03:00
Component принадлежит `react`, если его responsibility ограничена domain contract: он работает с `AuthApi`, domain state и stable domain errors. Он не владеет page, route, redirect, product copy или composition нескольких domains.
2026-07-30 13:22:45 +03:00
Screen, route outcome, локальный текст ошибки, redirect и page-specific UI остаются в `compositions`. Dependency от React сама по себе не доказывает принадлежность Domain.