我有三个项目,让我们称它们为项目A、项目B和公共。
Common ,正如您可能已经猜到的,是一个包含两个项目中使用的文件的项目。
有一个组件,以前在项目a中,现在也将在项目B中使用,所以我已将其移动到通用。这个组件依赖于一个服务,所以我也可以将服务移动到Common(服务是一个单例(。但是,该服务进行HTTP调用,并且HTTP调用需要一个特定的ID(它是URL的一部分(。
服务HTTP调用所需的特定ID在项目A和项目B中都可用,但它们来自不同的源,将这些源移动到公共是不合适的。因此,我正试图找出一种方法,根据使用组件的项目,可能有条件地从服务中的任何一个源提取ID,但我不确定什么是最好的方法。
我考虑的是使用一种方法来设置服务中的URL,传入使用该服务的项目,然后让它从项目a或项目B中提取适当的服务。但我不确定这是否是一个好的解决方案。这是伪代码:
setBaseUrl(project) {
if (!this.baseURL) {
if (project === 'ProjectA') {
this.baseUrl += injector.get(projectAService).id;
} else {
this.baseUrl += injector.get(projectBService).id;
}
}
}
任何帮助都将不胜感激。也许这是包装类/继承可以有效解决的问题,但现在我被难住了。
实现目标的最佳方法是创建一个提供特定ID的提供者,并将其注入到您的服务中。通过这种方式,您可以为每个项目提供不同的ID。
常见
export const SpecificID = new InjectionToken<string>('SPECIFIC_ID');
export class YourCommonService {
constructor(
private http: HttpClient,
@Inject(SpecificID) private specificID: string, // Here you get the specific ID
) { }
}
项目Aapp.module.ts
@NgModule({
// ...
providers: [
{ provide: SpecificID, useValue: 'ProjA_Key' } // Here you provide the ID that belongs to the specific project
],
})
export class AppModule { }
您正在寻找桥接模式。
换句话说,依赖抽象,而不是具体化。
所以基本上你的代码应该如下所示:
setBaseUrl(project) {
if (!this.baseURL) {
this.baseUrl += this.projectService.id
}
}
}
您的ProjectA和ProjectB组件依赖项注入应该如下所示:
constructor(@Inject(PROJECT_SERVICE) projectService: IProjectService) {}
步骤:
在通用文件夹中,创建类似tokens.ts的文件并创建令牌
export const PROJECT_SERVICE = new InjectionToken('PROJECT_SERVICE );
然后在ProjectA模块中:
providers: [
{ provide: PROJECT_SERVICE, useClass: ProjectAService }
]
和
然后在ProjectB模块中:
providers: [
{ provide: PROJECT_SERVICE, useClass: ProjectBService }
]
项目A和项目B还实现了IProjectService
export class ProjectAService implements IProjectService {}
export class ProjectBService implements IProjectService {}
我们来了,享受吧!