两个项目之间的共享服务-需要根据使用该服务的项目引入来自不同依赖项的属性

  • 本文关键字:项目 服务 依赖 属性 两个 之间 共享 angular
  • 更新时间 :
  • 英文 :


我有三个项目,让我们称它们为项目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 {}

我们来了,享受吧!

最新更新