Невозможно внедрить пользовательский репозиторий - PullRequest
0 голосов
/ 13 мая 2019

Я хотел бы подкрепить свои репозитории кэшем в области запросов, аналогичном кеш первого уровня Hibernate .У меня есть несколько идей о том, как это сделать, и я привяжу это к typeorm -actional-cls-hooked .

Тем временем я создал простого провайдера следующим образом:

@Injectable({ scope: Scope.REQUEST })
export class RequestScopedCache extends Object {

  private storage: any = {};

  public set(key: string, value: any) {
    this.storage[key] = value;
  }

  public get(key: string) {
    return this.storage[key];
  }
}

Я хотел внедрить его в свой пользовательский репозиторий:

@Injectable()
@EntityRepository(Enqueued)
export class EnqueuedRepository extends Repository<Enqueued> {

  @Inject() readonly cache: RequestScopedCache;

  public async get(id: string) {
    const key = `${this.constructor.name}_${id}`;
    const result = this.cache.get(key);
    if (result) {
      return result;
    }
    const dbResult = await super.findOne(id);
    this.cache.set(key, dbResult);
    return dbResult;

  }

}

Ни внедрение конструктора, ни свойствоВнедрение работает на пользовательский репозиторий.Похоже, что все было спланировано так, что вызывается специфический для typeorm конструктор (который кажется закрытым) - первый введенный параметр выглядит как соединение.

Итак, я попробовал внедрение свойств, но это тоже не сработало.

Как я могу внедрить свою собственную конфигурацию в пользовательский репозиторий?

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Композиция над наследованием , которая упаковывает репозиторий и использует его в качестве провайдера, может помочь здесь:

@Injectable()
export class EnqueuedRepository {
    @Inject() readonly cache: RequestScopedCache;

    constructor(
        @InjectRepository(Enqueued) private readonly enqueuedRepository: Repository<Enqueued>
    ) {
    }
}
0 голосов
/ 17 мая 2019

Я не уверен, насколько это актуально, но один из возможных подходов к использованию пользовательских репозиториев такой: 1. Я создаю собственный класс репозитория, как показано ниже

@Injectable()
@EntityRepository(UserEntity)
export class UserRepository extends Repository<UserEntity> {
 // You repo code here
 }
  1. Затем введите его в желаемом классе, как показано ниже
export class UserService {
 constructor(
   @InjectRepository(UserRepository)
   private userRepository: UserRepository,
 ) {}
// Your code here
}

Приведенный выше подход помогает переопределить стандартные функции TypeORM и создавать таможенные функции в соответствии с вашими потребностями ...

...