Class Mirror (Зеркало класса)
import: @azure-net/kit
Класс-утилита для работы с метаданными классов и рефлексией (это если выражаться сложно). Если выражаться просто, то класс копирует и добавляет методы переданного в конструктор класса в класс, который наследует ClassMirror.
В каких ситуациях использовать:
- Нужно очень быстро пробросить репозиторий через сервисный слой к delivery слою
- Вы уверены, что ваш сервис никогда не будет иметь сценарной логики и является прямым проксированием репозитория
Тем не менее на глобальном уровне не рекомендуется оставлять сервисы в таком виде.
Методы, которые скопировал ClassMirror, можно переопределять. Так вы можете быстро проксировать репозиторий для работы с методами и дорабатывать и реализовывать логику методов уже после, по одному, при этом имея полностью рабочие проксированные методы.
Все методы обязательно должны быть декларированы. Это избавляет от высокого уровня неочевидности. Класс не будет автоматически типизировать наличие методов.
typescript
import { ClassMirror } from '@azure-net/kit';
import { AuthRepository } from '${ContextName}/infrastructure/http/repositories';
// Передайте репозиторий как дженерик в ClassMirror
class AuthService extends ClassMirror<AuthRepository> {
constructor(private repository: AuthRepository) {
// на этом этапе класс создаст копии методов
super(repository);
}
// Декларируем методы, которые проксируем в классе
declare login: AuthRepository['login'];
declare logout: AuthRepository['logout'];
// Если в репозитории есть метод current, он будет проксирован, но мы можем переопределить его, убрав из декларации
async current() {
return this.authRepository.current().catch(() => undefined);
}
}
// Один важный момент для общего понимания
const mirror = new AuthService(AuthRepository);
console.log(mirror.name); // 'AuthService'
console.log(mirror.methods); // ['constructor', 'login', 'logout', 'current']
console.log(mirror.properties); // ['repository']