diff --git a/packages/core/src/di/r3_injector.ts b/packages/core/src/di/r3_injector.ts index f6af39c0c8..2776e85bb2 100644 --- a/packages/core/src/di/r3_injector.ts +++ b/packages/core/src/di/r3_injector.ts @@ -482,10 +482,10 @@ export function providerToFactory( } else { if (isValueProvider(provider)) { factory = () => resolveForwardRef(provider.useValue); - } else if (isExistingProvider(provider)) { - factory = () => ɵɵinject(resolveForwardRef(provider.useExisting)); } else if (isFactoryProvider(provider)) { factory = () => provider.useFactory(...injectArgs(provider.deps || [])); + } else if (isExistingProvider(provider)) { + factory = () => ɵɵinject(resolveForwardRef(provider.useExisting)); } else { const classRef = resolveForwardRef( provider && diff --git a/packages/core/test/acceptance/di_spec.ts b/packages/core/test/acceptance/di_spec.ts index 863c3e3fcd..9a2df0297c 100644 --- a/packages/core/test/acceptance/di_spec.ts +++ b/packages/core/test/acceptance/di_spec.ts @@ -1901,4 +1901,36 @@ describe('di', () => { expect(fixture.nativeElement.textContent.trim()).toBe('2 (transformed) items'); }); + + // TODO: https://angular-team.atlassian.net/browse/FW-1779 + it('should prioritize useFactory over useExisting', () => { + abstract class Base {} + @Directive({selector: '[dirA]'}) + class DirA implements Base { + } + @Directive({selector: '[dirB]'}) + class DirB implements Base { + } + + const PROVIDER = {provide: Base, useExisting: DirA, useFactory: () => new DirB()}; + + @Component({selector: 'child', template: '', providers: [PROVIDER]}) + class Child { + constructor(readonly base: Base) {} + } + + @Component({template: `