53 lines
2.3 KiB
Markdown
53 lines
2.3 KiB
Markdown
|
|
---
|
|||
|
|
title: Композиция фабрик
|
|||
|
|
description: "Раздел показывает, как собрать API нескольких business-модулей в React screen-модуле. Пример подходит для простой композиции, когда screen сам является точкой использования доменов."
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# Композиция фабрик
|
|||
|
|
|
|||
|
|
Раздел показывает, как собрать API нескольких business-модулей в React screen-модуле. Пример подходит для простой композиции, когда screen сам является точкой использования доменов.
|
|||
|
|
|
|||
|
|
## Идея
|
|||
|
|
|
|||
|
|
Композиция фабрик выполняется в модуле-потребителе: screen, layout или другом модуле группы «Композиция». Business-модули не импортируют runtime-код друг друга напрямую, а cross-domain зависимости получают только через аргументы фабрик.
|
|||
|
|
|
|||
|
|
## Структура screen-модуля
|
|||
|
|
|
|||
|
|
```text
|
|||
|
|
screens/home/
|
|||
|
|
├── home.screen.tsx
|
|||
|
|
└── index.ts
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Сборка фабрик
|
|||
|
|
|
|||
|
|
Файл: `screens/home/home.screen.tsx`.
|
|||
|
|
|
|||
|
|
```tsx
|
|||
|
|
import { customerFactory } from '@/business/customer'
|
|||
|
|
import { orderFactory } from '@/business/order'
|
|||
|
|
|
|||
|
|
const customer = customerFactory()
|
|||
|
|
const order = orderFactory({ customer })
|
|||
|
|
|
|||
|
|
const { useOrder, OrderCard } = order
|
|||
|
|
|
|||
|
|
export const HomeScreen = () => {
|
|||
|
|
const currentOrder = useOrder()
|
|||
|
|
|
|||
|
|
return <OrderCard order={currentOrder} />
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`customerFactory` создаётся первой, потому что `orderFactory` зависит от части API домена `customer`. Модуль `order` не импортирует `customer` в runtime — зависимость передаётся снаружи.
|
|||
|
|
|
|||
|
|
## Публичный API screen-модуля
|
|||
|
|
|
|||
|
|
Файл: `screens/home/index.ts`.
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
export { HomeScreen } from './home.screen'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Screen экспортирует только собственный публичный API. Собранные экземпляры business API остаются деталями реализации screen-модуля.
|