Как работает иерархический DI Inversify? - PullRequest
0 голосов
/ 10 апреля 2020

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 контейнера?

1 Ответ

0 голосов
/ 17 апреля 2020

Строка кода magi c :

httpContext.container.getNamed<any>(TYPE.Controller, controllerName)[key](...args)

Именно здесь контроллер разрешается из дочернего контейнера и, следовательно, зависимость traceId также разрешается из дочерний контейнер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...