3.0 KiB
React module внутри Domain
Пояснение framework boundary Domain на примере React.
Связанные правила
Имя и место module
Framework-specific module находится непосредственно в Domain и называется именем framework:
domains/auth/react/
├── components/
├── hooks/
├── providers/
├── types/
└── index.ts
react точно обозначает framework и не создаёт пустую промежуточную Group вроде framework/react или bindings/react. Если Domain действительно поддерживает другой framework, он получает отдельный sibling module, например vue.
Роль React module
React module может:
- передать готовый
AuthApiчерез context/provider; - создать hook доступа к API или framework-neutral state;
- связать React lifecycle с subscription API;
- реализовать domain-specific React component.
Он не меняет business rules, не создаёт domain errors, не выбирает concrete adapters и не вызывает factory или preset. Сборка остаётся у composition graph owner; React module получает уже готовый instance.
type AuthProviderProps = PropsWithChildren<{
api: AuthApi
}>
export const AuthProvider = ({ api, children }: AuthProviderProps) => {
return <AuthContext.Provider value={api}>{children}</AuthContext.Provider>
}
Reactive state
Если AuthApi предоставляет framework-neutral protocol getSnapshot и subscribe, React module может использовать useSyncExternalStore:
'use client'
export const useAuthState = () => {
const api = useAuth()
return useSyncExternalStore(
api.subscribe,
api.getSnapshot,
api.getSnapshot,
)
}
Business не импортирует React и не возвращает React hook как единственный способ наблюдать state. React module не создаёт subscription до commit и возвращает cleanup через protocol useSyncExternalStore.
Domain UI и compositions
Component принадлежит react, если его responsibility ограничена domain contract: он работает с AuthApi, domain state и stable domain errors. Он не владеет page, route, redirect, product copy или composition нескольких domains.
Screen, route outcome, локальный текст ошибки, redirect и page-specific UI остаются в compositions. Dependency от React сама по себе не доказывает принадлежность Domain.