NestJS: внедрение сервиса в модели / сущности

В настоящее время я застрял над проблемой, которую я не знаю, как решить:

В моем приложении NestJS я хотел бы, чтобы все мои TypeORM Entities расширяли класс BaseEntity, который предоставляет некоторые общие функции. Например, я хотел бы предоставить дополнительный метод getHashedID(), который хеширует (и, следовательно, прячется) внутренний идентификатор от моих клиентов API.

Хеширование выполняется с помощью HashIdService, который предоставляет методы encode() и decode().

Моя установка выглядит так (убраны декораторы для удобства чтения!):

export class User extends BaseEntity {
  id: int;
  email: string;
  name: string;
  // ...
}

export class BaseEntity {
  @Inject(HashIdService) private readonly hashids: HashIdService;

  getHashedId() {
    return this.hashids.encode(this.id);
  }
}

Однако, если я вызываю метод this.hashids.encode(), он генерирует исключение с:

Cannot read property 'encode' of undefined

Как я могу преобразовать услугу в класс inject? Это вообще возможно?

ОБНОВЛЕНИЕ # 1 В частности, я хотел бы «вставить» entity/model в свой HashIdService. Кроме того, Entities должен иметь метод Entities, который возвращает их хешированный идентификатор. Поскольку я не хочу делать это «снова и снова», я хотел бы «спрятать» этот метод в getHashedId(), как описано выше.

Моя текущая версия NestJS выглядит следующим образом:

Nest version:
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]
+-- @nestjs/[email protected]

Спасибо большое за помощь!

Почему необходимо, чтобы эта конкретная служба вводилась, а не просто ссылалась на служебную функцию?

Jesse Carter 23.11.2018 15:25

@JesseCarter Может быть, ему нужно что-то вроде доступа к БД, которая в противном случае вводится?

Lazar Ljubenović 24.11.2018 18:02

@JesseCarter Я только что обновил свой первоначальный вопрос. Я хотел бы внедрить HashIdService, чтобы мои объекты могли хешировать свой собственный идентификатор. Как бы вы решили эту проблему? Что вы имеете в виду под «функцией полезности»?

zorn 25.11.2018 12:07

Вам необходимо вручную настроить сервис, если вы хотите использовать его в модели.

aristotll 21.04.2019 06:17

Вы рассматривали возможность расширения BaseEntity, а затем использовать расширенную версию?

André Oliveira 22.04.2019 19:23
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Лучшие практики использования Guice в ваших Java-проектах
Лучшие практики использования Guice в ваших Java-проектах
Guice от Google - это популярная система инъекции зависимостей для Java-приложений. Он помогает разработчикам создавать более ремонтопригодный,...
9
5
2 637
1

Ответы 1

Если вам не нужно вводить HashIdService или имитировать его в модульном тесте, вы можете просто сделать это:

BaseEntity.ts

import { HashIdService } from './HashIdService.ts';

export class BaseEntity {

    public id: number;

    public get hasedId() : string|null {
        const hashIdService = new HashIdService();
        return this.id ? hashIdService.encode(this.id) : null;
    }
}

User.ts

export class User extends BaseEntity {
    public email: string;
    public name: string;
    // ...
}

Затем создайте своего пользователя:

const user = new User();
user.id = 1234;
user.name = 'Tony Stark';
user.email = '[email protected]';

console.info(user.hashedId);
//a1b2c3d4e5f6g7h8i9j0...

Это становится чрезвычайно трудным / невозможным, если HashIdService также имеет цепочку DI.

coler-j 02.06.2020 16:15

Другие вопросы по теме

ОШИБКА: ссылка на "формат" объекта должна заканчиваться разделителем \ '; \'. '
Aframe: как связать объекты, чтобы пользователь мог связывать / отключать объекты, чтобы объекты вместе анимировались и взаимодействовали друг с другом
Совпадение регулярных выражений для небольшого десятичного числа не выполняется во фреймворке объекта
Дерево импорта / экспорта Entity Framework Core сущностей с похожими внешними ключами
SQL to LINQ - множественная группировка по операторам и соединение
OroCommerce - Symfony: как переопределить сущность (пользовательская учетная запись для регистрации клиентов)
Составной ключ - гибернация
Как может постоянная сущность иметь связанный идентификатор, но не иметь представления в базе данных?
ОШИБКА при сохранении объекта: подзапрос в FROM должен иметь псевдоним
Операция не может быть завершена, потому что DbContext был удален в сущности