diff --git a/modules/angular2/src/core/di/provider_util.dart b/modules/angular2/src/core/di/provider_util.dart new file mode 100644 index 0000000000..9b83032815 --- /dev/null +++ b/modules/angular2/src/core/di/provider_util.dart @@ -0,0 +1,20 @@ +import './provider.dart' show Provider; + +bool isProviderLiteral(dynamic obj) { + if (obj is Map) { + Map map = obj as Map; + return map.containsKey('provide'); + } else { + return false; + } +} + +Provider createProvider(dynamic obj) { + Map map = obj as Map; + return new Provider(map['provide'], useClass: map['useClass'], + useValue: map['useValue'], + useExisting: map['useExisting'], + useFactory: map['useFactory'], + deps: map['deps'], + multi: map['multi']); +} diff --git a/modules/angular2/src/core/di/provider_util.ts b/modules/angular2/src/core/di/provider_util.ts new file mode 100644 index 0000000000..0b22cdb6fb --- /dev/null +++ b/modules/angular2/src/core/di/provider_util.ts @@ -0,0 +1,9 @@ +import {Provider} from './provider'; + +export function isProviderLiteral(obj: any): boolean { + return obj && typeof obj == 'object' && obj.provide; +} + +export function createProvider(obj: any): Provider { + return new Provider(obj.provide, obj); +} diff --git a/modules/angular2/src/core/di/reflective_injector.ts b/modules/angular2/src/core/di/reflective_injector.ts index f9a48f9a97..652b0b44f7 100644 --- a/modules/angular2/src/core/di/reflective_injector.ts +++ b/modules/angular2/src/core/di/reflective_injector.ts @@ -391,7 +391,8 @@ export abstract class ReflectiveInjector implements Injector { * * See {@link ReflectiveInjector#fromResolvedProviders} for more info. */ - static resolve(providers: Array): ResolvedReflectiveProvider[] { + static resolve(providers: Array): + ResolvedReflectiveProvider[] { return resolveReflectiveProviders(providers); } @@ -421,7 +422,7 @@ export abstract class ReflectiveInjector implements Injector { * because it needs to resolve the passed-in providers first. * See {@link Injector#resolve} and {@link Injector#fromResolvedProviders}. */ - static resolveAndCreate(providers: Array, + static resolveAndCreate(providers: Array, parent: Injector = null): ReflectiveInjector { var ResolvedReflectiveProviders = ReflectiveInjector.resolve(providers); return ReflectiveInjector.fromResolvedProviders(ResolvedReflectiveProviders, parent); @@ -512,7 +513,8 @@ export abstract class ReflectiveInjector implements Injector { * because it needs to resolve the passed-in providers first. * See {@link Injector#resolve} and {@link Injector#createChildFromResolved}. */ - resolveAndCreateChild(providers: Array): ReflectiveInjector { + resolveAndCreateChild( + providers: Array): ReflectiveInjector { return unimplemented(); } diff --git a/modules/angular2/src/core/di/reflective_provider.ts b/modules/angular2/src/core/di/reflective_provider.ts index 73f27d83fa..abbc7044fd 100644 --- a/modules/angular2/src/core/di/reflective_provider.ts +++ b/modules/angular2/src/core/di/reflective_provider.ts @@ -7,7 +7,7 @@ import { isArray, isType } from 'angular2/src/facade/lang'; -import {MapWrapper, ListWrapper} from 'angular2/src/facade/collection'; +import {MapWrapper, ListWrapper, StringMapWrapper} from 'angular2/src/facade/collection'; import {reflector} from 'angular2/src/core/reflection/reflection'; import {ReflectiveKey} from './reflective_key'; import { @@ -26,6 +26,7 @@ import { } from './reflective_exceptions'; import {resolveForwardRef} from './forward_ref'; import {Provider, ProviderBuilder, provide} from './provider'; +import {isProviderLiteral, createProvider} from './provider_util'; /** * `Dependency` is used by the framework to extend DI. @@ -144,7 +145,7 @@ export function resolveReflectiveProvider(provider: Provider): ResolvedReflectiv * Resolve a list of Providers. */ export function resolveReflectiveProviders( - providers: Array): ResolvedReflectiveProvider[] { + providers: Array): ResolvedReflectiveProvider[] { var normalized = _normalizeProviders(providers, []); var resolved = normalized.map(resolveReflectiveProvider); return MapWrapper.values( @@ -188,8 +189,9 @@ export function mergeResolvedReflectiveProviders( return normalizedProvidersMap; } -function _normalizeProviders(providers: Array, - res: Provider[]): Provider[] { +function _normalizeProviders( + providers: Array, + res: Provider[]): Provider[] { providers.forEach(b => { if (b instanceof Type) { res.push(provide(b, {useClass: b})); @@ -197,6 +199,9 @@ function _normalizeProviders(providers: Array { + var provider = ReflectiveInjector.resolve([ + {provide: Engine, useClass: BrokenEngine, multi: true}, + {provide: Engine, useClass: TurboEngine, multi: true} + ])[0]; + + expect(provider.key.token).toBe(Engine); + expect(provider.multiProvider).toEqual(true); + expect(provider.resolvedFactories.length).toEqual(2); + }); + it("should support multi providers with only one provider", () => { var provider = ReflectiveInjector.resolve( [new Provider(Engine, {useClass: BrokenEngine, multi: true})])[0];