2017-12-02 5 views
0

サービスを動的に注入する際に問題があります。角2 +パッケージでサービスを動的に注入/交換する

プロジェクトを実行しているとき、私はエラーを得た
// NPM Package 1: 
@Injectable() 
export abstract class BaseService { ... } 
@Injectable() 
export class ServiceA extends BaseService { ... } 
@Injectable() 
export class ServiceB extends BaseService { ... } 

// NPM Package 2: 
// nav.module.ts 
@NgModule({ 
    imports: [ ... ], 
    declarations: [ 
     NavComponent 
    ], 
    exports: [ 
     NavComponent 
    ], 
    providers: [] 
}) 
export class NavModule { } 

// nav.component.ts 
@Component({ 
    selector: 'app-nav', 
    ... 
}) 
export class NavComponent { 
    constructor(private baseService: BaseService) { ... } 
} 


// main project 
// app.module.ts: 
@NgModule({ 
    declarations: [ 
     AppComponent 
    ], 
    imports: [ 
     NavModule 
    ], 
    providers: [ 
     {provide: BaseService, useClass: ServiceB } 
    ], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

// app.component.ts 
@Component({ ... }) 
export class AppComponent implements OnInit { 
    constructor(private baseService: BaseService) { } 
    ... 
} 

// app.component.html 
<app-nav></app-nav> 

Error: No provider for BaseService! 

私が直接でNPMパッケージ2のコードが含まれている場合、サービスがNPMパッケージ2.2

に注入されていませんメインプロジェクトは問題ありません。 BaseServiceはServiceBとして注入されます。

何が間違っている可能性がありますか? NPMパッケージを生成するためにng-packagr(https://github.com/dherges/ng-packagr)を使用しました。

+0

最小限の複製を共有できますか? – yurzui

答えて

0

NavModuleはAppModuleによってインポートされていますが、他の方法でインポートされることはありません。だから、あなたがすべき

  • 変更依存方向と作るNavModuleインポートAppoduleいずれか
  • がサービスを提供していSharedModuleを作成し、NavModuleを作るだけでなくサービスを提供NavModule
  • メイクAppModuleにNavComponentを入れ
  • とAppModuleは両方ともそれからインポートします。

NavModuleはUi-Libraryの一部のように聞こえるため(すべてのコンポーネントはルーティングのみを担当するのではなく、acessなどは表示しません)、本当に「BaseService」が必要かどうかを確認することをおすすめします。 Ui関連の機能、Ui-Library専用のサービスを提供する

関連する問題