Skip to content

Commit

Permalink
@dandi/core - add Resolver.resolveInContext and implementation in Con…
Browse files Browse the repository at this point in the history
…tainer

- allows resolving dependencies within an existing ResolverContext, the same as invokeInContext
  • Loading branch information
DanielSchaffer committed Sep 28, 2018
1 parent 313f43b commit d7bf609
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 5 deletions.
21 changes: 16 additions & 5 deletions core/src/container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ export class Container<TConfig extends ContainerConfig = ContainerConfig> implem
}
}

public async resolve<T>(
public async resolveInContext<T>(
context: ResolverContext<T>,
token: InjectionToken<T>,
optional: boolean = false,
...repositories: Repository[]
Expand All @@ -82,19 +83,29 @@ export class Container<TConfig extends ContainerConfig = ContainerConfig> implem
throw new MissingTokenError();
}

const context = ResolverContext.create<T>(token, null, ...this.repositories, ...repositories);
const resolveContext = context
? context.childContext(token, null, ...this.repositories, ...repositories)
: ResolverContext.create<T>(token, null, ...this.repositories, ...repositories);
try {
const result = await this.resolveInternal(token, optional, context);
const result = await this.resolveInternal(token, optional, resolveContext);
if (!result) {
return null;
}
return context.resolveValue(result);
return resolveContext.resolveValue(result);
} catch (err) {
context.dispose(`Container error during resolve(): ${err.message}`);
resolveContext.dispose(`Container error during resolve(): ${err.message}`);
throw err;
}
}

public resolve<T>(
token: InjectionToken<T>,
optional: boolean = false,
...repositories: Repository[]
): Promise<ResolveResult<T>> {
return this.resolveInContext(null, token, optional, ...repositories);
}

public invoke(instance: any, member: Function, ...repositories: Repository[]): Promise<any> {
return this.invokeInContext(null, instance, member, ...repositories);
}
Expand Down
7 changes: 7 additions & 0 deletions core/src/resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ export interface Resolver {
): Promise<any>;

resolve<T>(token: InjectionToken<T>, optional?: boolean, ...repositories: Repository[]): Promise<ResolveResult<T>>;

resolveInContext<T>(
context: ResolverContext<any>,
token: InjectionToken<T>,
optional?: boolean,
...repositories: Repository[]
): Promise<ResolveResult<T>>;
}

export const Resolver = localOpinionatedToken<Resolver>('Resolver', {
Expand Down

0 comments on commit d7bf609

Please sign in to comment.