Skip to content

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 загружен');
    }
});

Особенности:

  • Ленивая инициализация — сервисы создаются по требованию
  • Кеширование — каждый экземпляр создаётся один раз
  • Зависимости — автоматическое разрешение зависимостей между провайдерами
  • Контекст — поддержка серверного и клиентского контекста
  • Очистка — автоматическая очистка ресурсов