无法注入自定义存储库

时间:2019-05-13 10:01:35

标签: javascript typescript express nestjs

我想使用请求范围的缓存来备份我的存储库,类似于Hibernate的first-level-cache。我对如何执行此操作有一些想法,并将其绑定到typeorm-transactional-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 个答案:

答案 0 :(得分:1)

Composition over inheritance,它包装了一个存储库,并将其用作提供程序可以在这里提供帮助:

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

    constructor(
        @InjectRepository(Enqueued) private readonly enqueuedRepository: Repository<Enqueued>
    ) {
    }
}

答案 1 :(得分:0)

我不确定这是否完全相关,但是使用自定义存储库的一种可能方法如下:  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功能并根据您的需要创建海关功能...