Skip to content

Commit 63754eb

Browse files
committed
fix(core): avoid eager providers re-initialization
Fix a corner case where eager providers were getting constructed twice if the provider was requested before the initialization of the NgModule is complete.
1 parent 8d0ee34 commit 63754eb

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

packages/core/src/view/ng_module.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ export function initNgModule(data: NgModuleData) {
6868
for (let i = 0; i < def.providers.length; i++) {
6969
const provDef = def.providers[i];
7070
if (!(provDef.flags & NodeFlags.LazyProvider)) {
71-
providers[i] = _createProviderInstance(data, provDef);
71+
if (providers[i] === undefined) {
72+
providers[i] = _createProviderInstance(data, provDef);
73+
}
7274
}
7375
}
7476
}

packages/core/test/linker/ng_module_integration_spec.ts

+29
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,35 @@ function declareTests({useJit}: {useJit: boolean}) {
883883

884884
expect(createModule(MyModule).injector.get('eager1')).toBe('v1: v2');
885885
});
886+
887+
it('eager providers should get initialized only once', () => {
888+
@Injectable()
889+
class MyService1 {
890+
public innerService: MyService2;
891+
constructor(injector: Injector) {
892+
// Create MyService2 before it it's initialized by TestModule.
893+
this.innerService = injector.get(MyService2);
894+
}
895+
}
896+
897+
@Injectable()
898+
class MyService2 {
899+
constructor() {}
900+
}
901+
902+
@NgModule({
903+
providers: [MyService1, MyService2],
904+
})
905+
class TestModule {
906+
constructor(public service1: MyService1, public service2: MyService2) {}
907+
}
908+
909+
const moduleRef = createModule(TestModule, injector);
910+
const module = moduleRef.instance;
911+
912+
// MyService2 should not get initialized twice.
913+
expect(module.service1.innerService).toBe(module.service2);
914+
});
886915
});
887916

888917
it('should throw when no provider defined', () => {

0 commit comments

Comments
 (0)