Skip to content

Пример реализации application слоя на основе @azure-net/kit

Подготовительный этап

Предполагается, что все типы были описаны в доменном слое, а инфраструктурный слой создан и в нём готовы нужные нам репозитории. Этот пример является продолжением примера по инфраструктурному слою, весь пример уже был описан в предыдущих разделах и здесь просто собран воедино. Единственное, что важно понимать — это предназначение слоя и то, что в инфраструктурном слое мы получаем данные с бэка и можем привести данные к нужному нам формату без использования бизнес-логики. В этом слое мы выполняем сценарии, используя при этом доменную бизнес-логику и данные, полученные вызовом методов из инфраструктуры. Слой не имеет права на UI-логику и взаимодействие с UI, а также не имеет права на общение с API.

Вы имеете право на создание оркестраторов и use-cases в этом слое, если это вам требуется и просто сервисов вам недостаточно.

1. Service

typescript
import { ClassMirror } from '@azure-net/kit';
import { AuthRepository } from '${ContextName}/infrastructure/http/repositories';
import type {IUser} from '${ContextName}/domain/user';

class AuthService extends ClassMirror<AuthRepository> {
    constructor(private repository: AuthRepository) {
      super(repository);
    }
    
    
    // Возможно в будущем мы расширим эти методы и уберем класс для зеркалирования, пока оставим его в таком виде.
    declare login: AuthRepository['login'];
    declare logout: AuthRepository['logout'];


    async current() {
        const user = await this.authRepository.current().catch(() => undefined);
        if (user && this.checkStatus(user)) {
            return user;
        }
        return undefined; // или например throw Error, не важно, главное пример
    }
    
    checkStatus(user: IUser) {
        // Some scenario by status
    }
}

2. Provider

typescript
import { createBoundaryProvider } from '@azure-net/kit';
import { InfrastructureProvider } from '${ContextName}/infrastructure';
import { AuthService } from '../services';

export const ApplicationProvider = createBoundaryProvider('{ContextName}ApplicationProvider', {
    dependsOn: { InfrastructureProvider },
    register: ({ InfrastructureProvider }) => ({
        AuthService: () => new AuthService(InfrastructureProvider.AuthRepository)
    })
});