UNPKG

9.79 kBTypeScriptView Raw
1/**
2 * @license
3 * Copyright Google Inc. All Rights Reserved.
4 *
5 * Use of this source code is governed by an MIT-style license that can be
6 * found in the LICENSE file at https://angular.io/license
7 */
8import { Injector } from './injector';
9import { Provider } from './provider';
10import { ResolvedReflectiveProvider } from './reflective_provider';
11/**
12 * A ReflectiveDependency injection container used for instantiating objects and resolving
13 * dependencies.
14 *
15 * An `Injector` is a replacement for a `new` operator, which can automatically resolve the
16 * constructor dependencies.
17 *
18 * In typical use, application code asks for the dependencies in the constructor and they are
19 * resolved by the `Injector`.
20 *
21 * ### Example ([live demo](http://plnkr.co/edit/jzjec0?p=preview))
22 *
23 * The following example creates an `Injector` configured to create `Engine` and `Car`.
24 *
25 * ```typescript
26 * @Injectable()
27 * class Engine {
28 * }
29 *
30 * @Injectable()
31 * class Car {
32 * constructor(public engine:Engine) {}
33 * }
34 *
35 * var injector = ReflectiveInjector.resolveAndCreate([Car, Engine]);
36 * var car = injector.get(Car);
37 * expect(car instanceof Car).toBe(true);
38 * expect(car.engine instanceof Engine).toBe(true);
39 * ```
40 *
41 * Notice, we don't use the `new` operator because we explicitly want to have the `Injector`
42 * resolve all of the object's dependencies automatically.
43 *
44 * @stable
45 */
46export declare abstract class ReflectiveInjector implements Injector {
47 /**
48 * Turns an array of provider definitions into an array of resolved providers.
49 *
50 * A resolution is a process of flattening multiple nested arrays and converting individual
51 * providers into an array of {@link ResolvedReflectiveProvider}s.
52 *
53 * ### Example ([live demo](http://plnkr.co/edit/AiXTHi?p=preview))
54 *
55 * ```typescript
56 * @Injectable()
57 * class Engine {
58 * }
59 *
60 * @Injectable()
61 * class Car {
62 * constructor(public engine:Engine) {}
63 * }
64 *
65 * var providers = ReflectiveInjector.resolve([Car, [[Engine]]]);
66 *
67 * expect(providers.length).toEqual(2);
68 *
69 * expect(providers[0] instanceof ResolvedReflectiveProvider).toBe(true);
70 * expect(providers[0].key.displayName).toBe("Car");
71 * expect(providers[0].dependencies.length).toEqual(1);
72 * expect(providers[0].factory).toBeDefined();
73 *
74 * expect(providers[1].key.displayName).toBe("Engine");
75 * });
76 * ```
77 *
78 * See {@link ReflectiveInjector#fromResolvedProviders} for more info.
79 */
80 static resolve(providers: Provider[]): ResolvedReflectiveProvider[];
81 /**
82 * Resolves an array of providers and creates an injector from those providers.
83 *
84 * The passed-in providers can be an array of `Type`, {@link Provider},
85 * or a recursive array of more providers.
86 *
87 * ### Example ([live demo](http://plnkr.co/edit/ePOccA?p=preview))
88 *
89 * ```typescript
90 * @Injectable()
91 * class Engine {
92 * }
93 *
94 * @Injectable()
95 * class Car {
96 * constructor(public engine:Engine) {}
97 * }
98 *
99 * var injector = ReflectiveInjector.resolveAndCreate([Car, Engine]);
100 * expect(injector.get(Car) instanceof Car).toBe(true);
101 * ```
102 *
103 * This function is slower than the corresponding `fromResolvedProviders`
104 * because it needs to resolve the passed-in providers first.
105 * See {@link Injector#resolve} and {@link Injector#fromResolvedProviders}.
106 */
107 static resolveAndCreate(providers: Provider[], parent?: Injector): ReflectiveInjector;
108 /**
109 * Creates an injector from previously resolved providers.
110 *
111 * This API is the recommended way to construct injectors in performance-sensitive parts.
112 *
113 * ### Example ([live demo](http://plnkr.co/edit/KrSMci?p=preview))
114 *
115 * ```typescript
116 * @Injectable()
117 * class Engine {
118 * }
119 *
120 * @Injectable()
121 * class Car {
122 * constructor(public engine:Engine) {}
123 * }
124 *
125 * var providers = ReflectiveInjector.resolve([Car, Engine]);
126 * var injector = ReflectiveInjector.fromResolvedProviders(providers);
127 * expect(injector.get(Car) instanceof Car).toBe(true);
128 * ```
129 * @experimental
130 */
131 static fromResolvedProviders(providers: ResolvedReflectiveProvider[], parent?: Injector): ReflectiveInjector;
132 /**
133 * Parent of this injector.
134 *
135 * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
136 * -->
137 *
138 * ### Example ([live demo](http://plnkr.co/edit/eosMGo?p=preview))
139 *
140 * ```typescript
141 * var parent = ReflectiveInjector.resolveAndCreate([]);
142 * var child = parent.resolveAndCreateChild([]);
143 * expect(child.parent).toBe(parent);
144 * ```
145 */
146 abstract get parent(): Injector | null;
147 /**
148 * Resolves an array of providers and creates a child injector from those providers.
149 *
150 * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
151 * -->
152 *
153 * The passed-in providers can be an array of `Type`, {@link Provider},
154 * or a recursive array of more providers.
155 *
156 * ### Example ([live demo](http://plnkr.co/edit/opB3T4?p=preview))
157 *
158 * ```typescript
159 * class ParentProvider {}
160 * class ChildProvider {}
161 *
162 * var parent = ReflectiveInjector.resolveAndCreate([ParentProvider]);
163 * var child = parent.resolveAndCreateChild([ChildProvider]);
164 *
165 * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);
166 * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);
167 * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));
168 * ```
169 *
170 * This function is slower than the corresponding `createChildFromResolved`
171 * because it needs to resolve the passed-in providers first.
172 * See {@link Injector#resolve} and {@link Injector#createChildFromResolved}.
173 */
174 abstract resolveAndCreateChild(providers: Provider[]): ReflectiveInjector;
175 /**
176 * Creates a child injector from previously resolved providers.
177 *
178 * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
179 * -->
180 *
181 * This API is the recommended way to construct injectors in performance-sensitive parts.
182 *
183 * ### Example ([live demo](http://plnkr.co/edit/VhyfjN?p=preview))
184 *
185 * ```typescript
186 * class ParentProvider {}
187 * class ChildProvider {}
188 *
189 * var parentProviders = ReflectiveInjector.resolve([ParentProvider]);
190 * var childProviders = ReflectiveInjector.resolve([ChildProvider]);
191 *
192 * var parent = ReflectiveInjector.fromResolvedProviders(parentProviders);
193 * var child = parent.createChildFromResolved(childProviders);
194 *
195 * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);
196 * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);
197 * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));
198 * ```
199 */
200 abstract createChildFromResolved(providers: ResolvedReflectiveProvider[]): ReflectiveInjector;
201 /**
202 * Resolves a provider and instantiates an object in the context of the injector.
203 *
204 * The created object does not get cached by the injector.
205 *
206 * ### Example ([live demo](http://plnkr.co/edit/yvVXoB?p=preview))
207 *
208 * ```typescript
209 * @Injectable()
210 * class Engine {
211 * }
212 *
213 * @Injectable()
214 * class Car {
215 * constructor(public engine:Engine) {}
216 * }
217 *
218 * var injector = ReflectiveInjector.resolveAndCreate([Engine]);
219 *
220 * var car = injector.resolveAndInstantiate(Car);
221 * expect(car.engine).toBe(injector.get(Engine));
222 * expect(car).not.toBe(injector.resolveAndInstantiate(Car));
223 * ```
224 */
225 abstract resolveAndInstantiate(provider: Provider): any;
226 /**
227 * Instantiates an object using a resolved provider in the context of the injector.
228 *
229 * The created object does not get cached by the injector.
230 *
231 * ### Example ([live demo](http://plnkr.co/edit/ptCImQ?p=preview))
232 *
233 * ```typescript
234 * @Injectable()
235 * class Engine {
236 * }
237 *
238 * @Injectable()
239 * class Car {
240 * constructor(public engine:Engine) {}
241 * }
242 *
243 * var injector = ReflectiveInjector.resolveAndCreate([Engine]);
244 * var carProvider = ReflectiveInjector.resolve([Car])[0];
245 * var car = injector.instantiateResolved(carProvider);
246 * expect(car.engine).toBe(injector.get(Engine));
247 * expect(car).not.toBe(injector.instantiateResolved(carProvider));
248 * ```
249 */
250 abstract instantiateResolved(provider: ResolvedReflectiveProvider): any;
251 abstract get(token: any, notFoundValue?: any): any;
252}
253export declare class ReflectiveInjector_ implements ReflectiveInjector {
254 keyIds: number[];
255 objs: any[];
256 /**
257 * Private
258 */
259 constructor(_providers: ResolvedReflectiveProvider[], _parent?: Injector);
260 get(token: any, notFoundValue?: any): any;
261 get parent(): Injector | null;
262 resolveAndCreateChild(providers: Provider[]): ReflectiveInjector;
263 createChildFromResolved(providers: ResolvedReflectiveProvider[]): ReflectiveInjector;
264 resolveAndInstantiate(provider: Provider): any;
265 instantiateResolved(provider: ResolvedReflectiveProvider): any;
266 getProviderAtIndex(index: number): ResolvedReflectiveProvider;
267 private _getMaxNumberOfObjects;
268 private _instantiateProvider;
269 private _instantiate;
270 private _getByReflectiveDependency;
271 private _getByKey;
272 private _getObjByKeyId;
273 get displayName(): string;
274 toString(): string;
275}