angular - 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>
) {}
但是如果我像这样直接使用它,它就可以完美地工作
constructor(
@Inject(getRepoEntityToken(Post)) private readonly postRepo: Repository<Post>
) {}
有什么方法可以使用自定义装饰器根据提供的实体注入存储库实例?任何帮助将不胜感激。谢谢。
解决方案
推荐阅读
- java - 实现分支逻辑时跨Flowables取消
- javascript - 无法注入
- postgresql - 在 Postgres 中创建函数时出错
- django-taggit - Django-taggit 使用选择下拉菜单
- c# - Cefsharp 平滑滚动?
- php - 使用 Homestead Web 服务 - 我无法将 PHP 脚本移动到服务器文件管理器中?(错误 0x39)
- html - 字体真棒图标未通过 cdn.fontawesome.com 呈现
- php - 有没有办法删除传输到另一个选项卡的数据?避免在同一页面中重复?PHP 代码点火器
- javascript - 检测 div 上的“手动”水平滚动
- c++ - 如何使用谓词获取元组的元素引用?