2017-07-04 123 views
2

我有一個關於角度依賴注射的快速問題。我已經閱讀過,如果你想要一個服務在應用程序中只有一個實例,它應該作爲提供者包含在AppModule中,而不是使用它的任何組件。這仍然會應用AppModule導入的其他模塊。例如,我想在我的SharedModule中將AuthService作爲提供者。如果我將這個模塊導入到AppModule中,那麼我的應用程序中的所有組件都將共享同一個服務實例嗎?角度依賴注射

+0

請在標題中描述您的問題。 –

+0

我真的不知道該怎麼做。 – user455289

+0

是的,除了懶惰的加載提供程序的根注入器 –

回答

1

簡短的回答:是的

但..

不要指定共享模塊中應用範圍的單供應商。導入該共享模塊的延遲加載模塊將生成其自己的服務副本。

來源:https://angular.io/guide/ngmodule#why-userservice-isnt-shared

+0

我看到,因爲可能多次導入SharedModule,所以會有多個AuthModule實例。在CoreModule中,它只會被導入一次。對? – user455289

+0

@ user455289是exaclty,但只有當這些模塊被延遲加載。如果沒有,它會工作似乎但不推薦。如果在角度文檔中不推薦使用某些東西,則應該考慮它,因爲它們可能會在將來的版本中更改它。 – echonax

+0

哦,對,謝謝。 – user455289

0

不,你不能使用NgModule進口/出口強制執行Singleton模式。正如echonax回答指出的那樣,懶加載模塊再次引導所有服務。

這樣說,你可以通過構造函數阻止模塊上的重複導入。這將迫使開發人員管理模塊加載順序,並且阻止懶惰模塊直接導入它。如果模塊是由輔助模塊導入的,它似乎解決了這個問題。

您可以阻止這樣在你NgModule類的構造函數

@NgModule({ 
    providers: [ 
     MySingletonService 
    ] 
}) 
export class ExampleModule { 
    public constructor(@Optional() @SkipSelf() parentModule: ExampleModule) { 
     if (parentModule) { 
      throw new Error('ExampleModule is already loaded'); 
     } 
    } 
} 

最好是創建在其中只有一個服務模塊,而不是將其用於其他任何東西。這使得管理各種依賴關係變得更加容易。