Skip to content

Commit 94a67f7

Browse files
mheveryIgorMinar
authored andcommitted
feat(di): support map literals as providers
1 parent cd197dd commit 94a67f7

File tree

6 files changed

+583
-534
lines changed

6 files changed

+583
-534
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import './provider.dart' show Provider;
2+
3+
bool isProviderLiteral(dynamic obj) {
4+
if (obj is Map) {
5+
Map map = obj as Map;
6+
return map.containsKey('provide');
7+
} else {
8+
return false;
9+
}
10+
}
11+
12+
Provider createProvider(dynamic obj) {
13+
Map map = obj as Map;
14+
return new Provider(map['provide'], useClass: map['useClass'],
15+
useValue: map['useValue'],
16+
useExisting: map['useExisting'],
17+
useFactory: map['useFactory'],
18+
deps: map['deps'],
19+
multi: map['multi']);
20+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {Provider} from './provider';
2+
3+
export function isProviderLiteral(obj: any): boolean {
4+
return obj && typeof obj == 'object' && obj.provide;
5+
}
6+
7+
export function createProvider(obj: any): Provider {
8+
return new Provider(obj.provide, obj);
9+
}

modules/@angular/core/src/di/reflective_injector.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,8 @@ export abstract class ReflectiveInjector implements Injector {
390390
*
391391
* See {@link ReflectiveInjector#fromResolvedProviders} for more info.
392392
*/
393-
static resolve(providers: Array<Type | Provider | any[]>): ResolvedReflectiveProvider[] {
393+
static resolve(providers: Array<Type | Provider | {[k: string]: any} | any[]>):
394+
ResolvedReflectiveProvider[] {
394395
return resolveReflectiveProviders(providers);
395396
}
396397

@@ -420,7 +421,7 @@ export abstract class ReflectiveInjector implements Injector {
420421
* because it needs to resolve the passed-in providers first.
421422
* See {@link Injector#resolve} and {@link Injector#fromResolvedProviders}.
422423
*/
423-
static resolveAndCreate(providers: Array<Type | Provider | any[]>,
424+
static resolveAndCreate(providers: Array<Type | Provider | {[k: string]: any} | any[]>,
424425
parent: Injector = null): ReflectiveInjector {
425426
var ResolvedReflectiveProviders = ReflectiveInjector.resolve(providers);
426427
return ReflectiveInjector.fromResolvedProviders(ResolvedReflectiveProviders, parent);
@@ -511,7 +512,8 @@ export abstract class ReflectiveInjector implements Injector {
511512
* because it needs to resolve the passed-in providers first.
512513
* See {@link Injector#resolve} and {@link Injector#createChildFromResolved}.
513514
*/
514-
resolveAndCreateChild(providers: Array<Type | Provider | any[]>): ReflectiveInjector {
515+
resolveAndCreateChild(
516+
providers: Array<Type | Provider | {[k: string]: any} | any[]>): ReflectiveInjector {
515517
return unimplemented();
516518
}
517519

modules/@angular/core/src/di/reflective_provider.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import {
44
isPresent,
55
CONST_EXPR,
66
isArray,
7+
MapWrapper,
8+
ListWrapper
79
} from '@angular/facade';
8-
import {MapWrapper, ListWrapper} from '@angular/facade';
910
import {reflector} from '../reflection/reflection';
1011
import {ReflectiveKey} from './reflective_key';
1112
import {
1213
InjectMetadata,
13-
InjectableMetadata,
1414
OptionalMetadata,
1515
SelfMetadata,
1616
HostMetadata,
@@ -24,6 +24,7 @@ import {
2424
} from './reflective_exceptions';
2525
import {resolveForwardRef} from './forward_ref';
2626
import {Provider, ProviderBuilder, provide} from './provider';
27+
import {isProviderLiteral, createProvider} from './provider_util';
2728

2829
/**
2930
* `Dependency` is used by the framework to extend DI.
@@ -142,7 +143,7 @@ export function resolveReflectiveProvider(provider: Provider): ResolvedReflectiv
142143
* Resolve a list of Providers.
143144
*/
144145
export function resolveReflectiveProviders(
145-
providers: Array<Type | Provider | any[]>): ResolvedReflectiveProvider[] {
146+
providers: Array<Type | Provider | {[k: string]: any} | any[]>): ResolvedReflectiveProvider[] {
146147
var normalized = _normalizeProviders(providers, []);
147148
var resolved = normalized.map(resolveReflectiveProvider);
148149
return MapWrapper.values(
@@ -186,15 +187,19 @@ export function mergeResolvedReflectiveProviders(
186187
return normalizedProvidersMap;
187188
}
188189

189-
function _normalizeProviders(providers: Array<Type | Provider | ProviderBuilder | any[]>,
190-
res: Provider[]): Provider[] {
190+
function _normalizeProviders(
191+
providers: Array<Type | Provider | {[k: string]: any} | ProviderBuilder | any[]>,
192+
res: Provider[]): Provider[] {
191193
providers.forEach(b => {
192194
if (b instanceof Type) {
193195
res.push(provide(b, {useClass: b}));
194196

195197
} else if (b instanceof Provider) {
196198
res.push(b);
197199

200+
} else if (isProviderLiteral(b)) {
201+
res.push(createProvider(b));
202+
198203
} else if (b instanceof Array) {
199204
_normalizeProviders(b, res);
200205

modules/@angular/core/test/di/reflective_injector_spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,18 @@ export function main() {
532532
expect(provider.resolvedFactories.length).toEqual(2);
533533
});
534534

535+
536+
it("should support providers as hash", () => {
537+
var provider = ReflectiveInjector.resolve([
538+
{provide: Engine, useClass: BrokenEngine, multi: true},
539+
{provide: Engine, useClass: TurboEngine, multi: true}
540+
])[0];
541+
542+
expect(provider.key.token).toBe(Engine);
543+
expect(provider.multiProvider).toEqual(true);
544+
expect(provider.resolvedFactories.length).toEqual(2);
545+
});
546+
535547
it("should support multi providers with only one provider", () => {
536548
var provider = ReflectiveInjector.resolve(
537549
[new Provider(Engine, {useClass: BrokenEngine, multi: true})])[0];

0 commit comments

Comments
 (0)