Пример реализации application слоя на основе @azure-net/kit
Подготовительный этап
Предполагается, что все типы были описаны в доменном слое, а инфраструктурный слой создан и в нём готовы нужные нам репозитории. Этот пример является продолжением примера по инфраструктурному слою, весь пример уже был описан в предыдущих разделах и здесь просто собран воедино. Единственное, что важно понимать — это предназначение слоя и то, что в инфраструктурном слое мы получаем данные с бэка и можем привести данные к нужному нам формату без использования бизнес-логики. В этом слое мы выполняем сценарии, используя при этом доменную бизнес-логику и данные, полученные вызовом методов из инфраструктуры. Слой не имеет права на UI-логику и взаимодействие с UI, а также не имеет права на общение с API.
Вы имеете право на создание оркестраторов и use-cases в этом слое, если это вам требуется и просто сервисов вам недостаточно.
1. Service
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
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)
})
});