README inversify- express -utils содержит следующий пример для служб в области запросов .
Я пытаюсь реализовать что-то подобное для приложения Koa, однако я изо всех сил чтобы понять, как работает иерархический DI в этом примере.
import { inject, injectable } from "inversify";
import { BaseHttpController, BaseMiddleware, controller, httpGet } from "inversify-express-utils";
import * as express from "express";
const TYPES = {
TraceId: Symbol.for("TraceIdValue"),
TracingMiddleware: Symbol.for("TracingMiddleware"),
Service: Symbol.for("Service"),
};
@injectable()
class TracingMiddleware extends BaseMiddleware {
public handler(
req: express.Request,
res: express.Response,
next: express.NextFunction
) {
this.bind<string>(TYPES.TraceIdValue)
.toConstantValue(`${ req.header('X-Trace-Id') }`);
next();
}
}
@controller("/")
class TracingTestController extends BaseHttpController {
constructor(@inject(TYPES.Service) private readonly service: Service) {
super();
}
@httpGet(
"/",
TYPES.TracingMiddleware
)
public getTest() {
return this.service.doSomethingThatRequiresTheTraceID();
}
}
@injectable()
class Service {
constructor(@inject(TYPES.TraceIdValue) private readonly traceID: string) {
}
public doSomethingThatRequiresTheTraceID() {
// ...
}
}
Из чтения документов и кода я понимаю, что к каждому Express обработчику запросов прикреплено HttpContext
, к которому, в свою очередь, подключен дочерний контейнер DI .
В этом примере показано, что зависимость traceID
класса Service
разрешается из этого дочернего контейнера, подключенного к httpContext
в запрос Express.
Однако я не понимаю, как убедиться, что traceID
разрешается из дочернего контейнера, а не из родительского или root контейнера?