in src/dependency-container.ts [281:331]
private resolveRegistration<T>(
registration: Registration,
context: ResolutionContext
): T {
// If we have already resolved this scoped dependency, return it
if (
registration.options.lifecycle === Lifecycle.ResolutionScoped &&
context.scopedResolutions.has(registration)
) {
return context.scopedResolutions.get(registration);
}
const isSingleton = registration.options.lifecycle === Lifecycle.Singleton;
const isContainerScoped =
registration.options.lifecycle === Lifecycle.ContainerScoped;
const returnInstance = isSingleton || isContainerScoped;
let resolved: T;
if (isValueProvider(registration.provider)) {
resolved = registration.provider.useValue;
} else if (isTokenProvider(registration.provider)) {
resolved = returnInstance
? registration.instance ||
(registration.instance = this.resolve(
registration.provider.useToken,
context
))
: this.resolve(registration.provider.useToken, context);
} else if (isClassProvider(registration.provider)) {
resolved = returnInstance
? registration.instance ||
(registration.instance = this.construct(
registration.provider.useClass,
context
))
: this.construct(registration.provider.useClass, context);
} else if (isFactoryProvider(registration.provider)) {
resolved = registration.provider.useFactory(this);
} else {
resolved = this.construct(registration.provider, context);
}
// If this is a scoped dependency, store resolved instance in context
if (registration.options.lifecycle === Lifecycle.ResolutionScoped) {
context.scopedResolutions.set(registration, resolved);
}
return resolved;
}