我有三個專案,我們稱它們為Project A、Project B和Common。
正如您可能已經猜到的那樣, Common是一個包含兩個專案中使用的檔案的專案。
有一個組件,以前在Project A 中,現在也將在Project B 中使用,所以我把它移到了Common。這個組件依賴于一個服務,所以對我來說將服務也移動到Common是有意義的(服務是一個單例)。但是,該服務會進行 HTTP 呼叫,并且 HTTP 呼叫需要一個特定的 ID(它是 URL 的一部分)。
服務的 HTTP 呼叫所需的特定 ID 在Project A和Project B中都可用,但它們來自不同的來源,將這些來源移至Common是不合適的。因此,我正在嘗試找出一種方法,可以有條件地從服務中的任一源中提取 ID,具體取決于哪個專案正在使用該組件,但我不確定執行此操作的最佳方法是什么。
我考慮過使用一種方法在服務中設定 URL,傳入正在使用該服務的專案,然后讓它從Project A或Project B 中提取適當的服務。但我不確定這是一個很好的解決方案。這是偽代碼:
setBaseUrl(project) {
if (!this.baseURL) {
if (project === 'ProjectA') {
this.baseUrl = injector.get(projectAService).id;
} else {
this.baseUrl = injector.get(projectBService).id;
}
}
}
任何幫助將非常感激。也許這是包裝類/繼承可以有效解決的問題,但現在我很難過。
uj5u.com熱心網友回復:
實作目標的最佳方法是創建一個提供特定 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
) { }
}
專案 A app.module.ts
@NgModule({
// ...
providers: [
{ provide: SpecificID, useValue: 'ProjA_Key' } // Here you provide the ID that belongs to the specific project
],
})
export class AppModule { }
uj5u.com熱心網友回復:
您正在尋找橋接模式。
換句話說,依賴于抽象,而不是具體。
所以基本上你的代碼應該如下所示:
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 }
]
ProjectA 和 ProjectB 也實作了 IProjectService
export class ProjectAService implements IProjectService {}
export class ProjectBService implements IProjectService {}
來了,盡情享受吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/409358.html
標籤:
