首页 > 解决方案 > Angular:用于注入依赖的自定义装饰器(@Inject 包装器)

问题描述

我正在我的项目 (OSS) 中实现存储库模式,其中我的服务充当单个实体的存储库。实体拥有一些元数据(通过装饰器),并且对于每个实体,都会有单独的存储库服务实例(通过工厂)。实体的 InjectionToken 是根据一些逻辑计算的。

这是通过函数计算令牌的提供程序实现getRepoEntityToken(entity)

export function getRepoProviders(entities: RepoModelOrSchema[]): Provider[] {
  return entities.map((entity) => {
    return {
      provide: getRepoEntityToken(entity),
      useFactory: (httpClient: HttpClient, injector: Injector) => {
        const rootOpts = injector.get(REPO_ENTITY_DEFAULT_OPTIONS);
        return new EntityRepository(
          httpClient,
          rootOpts,
          new (entity as Constructable<RepoModel>)()
        );
      },
      deps: [HttpClient, Injector],
    };
  });
}

EntityService进一步从抽象 Repository<T,Q>类扩展。

我尝试通过调用内部调用Inject方法的包装函数来通过实体的帮助注入服务的相应实例,例如:

注入-repository.decorator.ts

import { Inject } from "@angular/core";

export const InjectRepository: (
  entity: RepoModelOrSchema
) => ParameterDecorator = (entity: RepoModelOrSchema) =>
  Inject(getRepoEntityToken(entity));

但是当我在组件/服务中使用这个自定义装饰器时,例如:

constructor(
    @InjectRepository(Post) private readonly postRepo: Repository<Post>
  ) {}

我收到一个运行时错误,说明: NullInjector 的运行时错误

但是如果我像这样直接使用它,它就可以完美地工作

constructor(
    @Inject(getRepoEntityToken(Post)) private readonly postRepo: Repository<Post>
  ) {}

有什么方法可以使用自定义装饰器根据提供的实体注入存储库实例?任何帮助将不胜感激。谢谢。

标签: angulartypescriptdependency-injectionfactorytypescript-decorator

解决方案


推荐阅读