Boundary Provider
- import:
@azure-net/kit - Preferred location (for context):
src/app/contexts/{ContextName}/infrastructure/providers
Позволяет создавать провайдеры, которые управляют зависимостями между слоями приложения. Они отвечают за регистрацию и связывание сервисов, ленивую инициализацию, управление жизненным циклом и передачу зависимостей дальше по архитектуре.
Помогает собрать и отдать зависимости (datasource → репозиторий → сервис → и т.д.). С помощью провайдеров ты показываешь: «вот мои классы, вот как их создавать, и вот от чего они зависят».
Дальше провайдер сам:
- создаёт объекты только тогда, когда они реально нужны;
- запоминает их, чтобы не плодить копии;
- умеет подтягивать зависимости из других провайдеров;
- даёт единое место, где видно, какие сервисы есть в контексте.
Проще говоря: Boundary Provider — это фабрика и менеджер зависимостей для твоего контекста.
Провайдеры используются не только в слое инфраструктуры, но поскольку это первый случай, когда они требуются в документации, их основы описаны здесь.
Пример создания провайдера для источника данных
typescript
import { createBoundaryProvider } from '@azure-net/kit';
// Первый аргумент — имя провайдера, которое должно обязательно быть уникальным на весь проект
export const DatasourceProvider = createBoundaryProvider('DatasourceProvider', {
// ключ register должен быть функцией, которая возвращает объект. Ключи объекта — функции, возвращающие нужный нам экземпляр класса.
register: () => ({
MyCustomDatasource: () =>
new MyCustomDatasource({
http: new HttpService({
baseUrl: `https://api-custom.ru`,
onRequest: (options) => {
const token = UniversalCookie.get('token');
if (token) {
options.headers = { ...options.headers, Authorization: `Bearer ${token}` };
}
}
})
})
})
});Пример создания провайдера для инфраструктурного слоя
typescript
// Создание провайдера
export const InfrastructureProvider = createBoundaryProvider('InfrastructureProvider', {
dependsOn: { DatasourceProvider }, // Зависимости от других провайдеров, ключи, зарегистрированные в dependsOn, мы получаем в методе register и можем их использовать
// Также регистрируем то, что отдадим следующему слою (application). В нём также будет провайдер, но уже зависящий от инфраструктуры.
register: ({ DatasourceProvider }) => ({
MyRepository: () => new MyRepository(DatasourceProvider.MyCustomDatasource),
AnotherRepository: () => new AnotherRepository(DatasourceProvider.MyCustomDatasource)
}),
boot: (services) => {
// Опциональная функция инициализации, происходит после регистрации всех сервисов и получает их в коллбэке.
// Позволяет выполнить действия с сервисами до инициализации провайдера
console.log('Infrastructure Provider загружен');
}
});Особенности:
- Ленивая инициализация — сервисы создаются по требованию
- Кеширование — каждый экземпляр создаётся один раз
- Зависимости — автоматическое разрешение зависимостей между провайдерами
- Контекст — поддержка серверного и клиентского контекста
- Очистка — автоматическая очистка ресурсов