源代碼:
import {StoreModule} from '@ngrx/store';
import {reducers} from './reducer';
import { NgModule } from '@angular/core';
import { CounterComponent } from './container/component/counter/counter.component';
import { CommonModule } from '@angular/common';
import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import { BookManageComponent } from './container/component/bookmanage/book-manage.component';
import { SearchInputComponent } from './searchbookcomponents/search-input/search-input.component';
import { BookListComponent } from './searchbookcomponents/book-list/book-list.component';
import { BookDetailComponent} from './searchbookcomponents/book-detail/book-detail.component';
import {NgZorroAntdModule} from 'ng-zorro-antd';
import { BookManageService } from './service/book-manage.service';
import { EffectsModule } from '@ngrx/effects';
import { BookManageEffects } from './effects/book-manager.effect';
@NgModule({
imports: [
CommonModule,
NgZorroAntdModule,
FormsModule,
ReactiveFormsModule,
StoreModule.forFeature('example', reducers), // 這個才是關鍵哦,
EffectsModule.forFeature([BookManageEffects])
],
declarations: [CounterComponent, BookManageComponent,
SearchInputComponent, BookListComponent, BookDetailComponent
],
exports: [CounterComponent, BookManageComponent, BookListComponent, BookDetailComponent],
providers: [BookManageService]
})
export class ExampleModule { }

core.js裡找到this.injectorDefTypes:
展開[[Entries]]:
找到ExampleModule下的imports區域:
應用程式代碼中定義的代碼:
StoreModule.forFeature('example', reducers)
這個方法實際上傳回了一個module StoreFeatureModule,在運作時能夠看到:
應用程式編寫的reducer也會出現在這裡:
多層級注入器 ModuleInjector 與 ElementInjector
這部分闡述來自這篇知乎文章
詳解 Angular 依賴注入ModuleInjector:通過 @NgModule() 或者 @Injectable() 配置
ElementInjector:通過 @Directive() 或 @Component() 中的 providers 屬性中配置
ModuleInjector
Injectable() 的 providedIn 屬性是要高于@NgModule() 的 providers 數組
當使用 Injectable() 的 providedIn 屬性時,優化工具可以做 tree-shaking,比如 providedIn: ‘root’