好的,所以我正在深入研究 TypeScript 繼承(特別是在 Angular 11 中),并且我已經設定了一個BasePageComponent來提供跨頁面存在的所有必要功能和服務。我遇到的問題是,現在我的基礎越來越臃腫,因為有些服務只在一兩個頁面上使用,但是為了擴展基礎,我們將這些服務包含在基礎中。
export class BasePageComponent {
constructor(
public uiPopupService: UiPopUpService,
public loaderService: LoaderService,
public questionService: QuestionService,
public aBunchOfOthers: OTHERS,
public exampleOneOffService: ExampleOneOffService
) {}
}
我意識到重復所有注入的服務會更高效,然后將它們全部傳遞給BasePageComponent這樣:
export class ChildPageComponent extends BasePageComponent {
constructor(
public uiPopupService: UiPopUpService,
public loaderService: LoaderService,
public questionService: QuestionService,
public aBunchOfOthers: OTHERS,
private exampleOneOffService: ExampleOneOffService
) {
super(uiPopupService, loaderService, questionService, aBunchOfOthers);
}
}
如果沒有其他方法,我將執行上述操作,但我在示例代碼中已暗示,我有一堆其他微服務包含在基礎中(如 15-20),所以我希望能夠做這樣的事情,我只宣告一個附加服務,并且仍然從父類繼承所有其他服務,但我沒有看到這樣做的方法。
export class ChildPageComponent extends BasePageComponent {
constructor(private otherExampleService: OtherExampleService){
super()
};
}
這種模式是否存在,我只是沒有在谷歌上搜索正確的關鍵字?
uj5u.com熱心網友回復:
這不是 DI 的作業方式。
DI 將為您提供建構式的引數。它不知道父類。
如果從子類呼叫父類將不會從 DI 獲得任何資訊。在這種情況下,引數通過super()
uj5u.com熱心網友回復:
這有點諷刺,你使用繼承來避免依賴注入,而實際上你應該使用依賴注入來避免繼承。如果組件具有共享服務,您只需將所需的服務放入建構式中即可。
如果它們具有共享功能,您可以將這些功能放在服務中。如果它們具有共享變數,您可以使用服務來傳遞資料。關鍵是將組件作為它們自己獨立的物體,因此如果您更改一個,它不會影響任何其他物體。
服務遵循同樣的理念,因為您可以更改服務的實作,而無需觸及任何使用該服務的檔案。想想你的設計,如果你需要洗掉或添加服務到基礎組件會發生什么?您現在需要編輯整個專案中的所有其他組件。當您將服務注入組件時,它也會創建該服務的實體。通過將所有服務注入到每個組件中,您正在創建無數浪費記憶體和處理能力的實體。你真的得到了什么回報嗎?
我想說的是你應該盡量避免擴展組件。Angular 提供了更好的設計理念。
要回答您的問題,是的,您可以創建一個匯入所有其他服務的全域服務,然后注入該大規模服務。然后,您可以擴展該服務并匯入更多內容。但為了所有神圣的愛,請不要。
uj5u.com熱心網友回復:
感謝@MikeOne對他鏈接到另一個答案的評論(手動注入服務)。
我能夠使用Injector.get基本上每個子組件中使用的 15 個小服務。然后對于較大的服務和只在少數子組件上使用的服務,我將它們注入到相關組件中。
對于將來來到這里的任何其他人:我遇到的一個障礙是Angular顯然ActivatedRoute不能與每個相關組件,這是其中的大多數,但這仍然比在每個頁面上初始化的 16 個一次性服務要好。Injector.get
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428627.html
