Skip to content

Commit 46cd868

Browse files
mheverymprobst
authored andcommitted
feat(di): support map literals as providers
1 parent b1a9e44 commit 46cd868

5 files changed

Lines changed: 55 additions & 7 deletions

File tree

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/angular2/src/core/di/reflective_injector.ts

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

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

modules/angular2/src/core/di/reflective_provider.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
isArray,
88
isType
99
} from 'angular2/src/facade/lang';
10-
import {MapWrapper, ListWrapper} from 'angular2/src/facade/collection';
10+
import {MapWrapper, ListWrapper, StringMapWrapper} from 'angular2/src/facade/collection';
1111
import {reflector} from 'angular2/src/core/reflection/reflection';
1212
import {ReflectiveKey} from './reflective_key';
1313
import {
@@ -26,6 +26,7 @@ import {
2626
} from './reflective_exceptions';
2727
import {resolveForwardRef} from './forward_ref';
2828
import {Provider, ProviderBuilder, provide} from './provider';
29+
import {isProviderLiteral, createProvider} from './provider_util';
2930

3031
/**
3132
* `Dependency` is used by the framework to extend DI.
@@ -144,7 +145,7 @@ export function resolveReflectiveProvider(provider: Provider): ResolvedReflectiv
144145
* Resolve a list of Providers.
145146
*/
146147
export function resolveReflectiveProviders(
147-
providers: Array<Type | Provider | any[]>): ResolvedReflectiveProvider[] {
148+
providers: Array<Type | Provider | {[k: string]: any} | any[]>): ResolvedReflectiveProvider[] {
148149
var normalized = _normalizeProviders(providers, []);
149150
var resolved = normalized.map(resolveReflectiveProvider);
150151
return MapWrapper.values(
@@ -188,15 +189,19 @@ export function mergeResolvedReflectiveProviders(
188189
return normalizedProvidersMap;
189190
}
190191

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

197199
} else if (b instanceof Provider) {
198200
res.push(b);
199201

202+
} else if (isProviderLiteral(b)) {
203+
res.push(createProvider(b));
204+
200205
} else if (b instanceof Array) {
201206
_normalizeProviders(b, res);
202207

modules/angular2/test/core/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)