我想使用请求范围的缓存来备份我的存储库,类似于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的构造函数(似乎是私有的)-注入的第一个参数似乎是一个连接。
因此,我尝试了属性注入,但这也不起作用。
如何将自己的配置注入到自定义存储库中?
答案 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
}
export class UserService {
constructor(
@InjectRepository(UserRepository)
private userRepository: UserRepository,
) {}
// Your code here
}
以上方法有助于覆盖默认的TypeORM功能并根据您的需要创建海关功能...