Как внедрить объект в метод маршрута в Fastify с помощью TypeScript?

Я создал следующий контроллер класса.

class ProjectsController {
  queryBus: QueryBus;

  commandBus: CommandBus;

  constructor(queryBus, commandBus) {
    this.queryBus = queryBus;
    this.commandBus = commandBus;
  }

  async get(req, reply) {
    reply.code(200).send(await this.queryBus.execute<GetOneProjectQuery, String>(GetOneProjectQuery));
  }

И это мой зарегистрированный маршрут.


export default async (fastify, opts, done) => {
  const { commandBus, queryBus } = fastify.di;
  const projectsController = new ProjectsController(queryBus, commandBus);
  await fastify.get("/", await projectsController.get);
  done();
};

Когда я делаю запрос, мой this.queryBus всегда не определен. Я не знаю, как внедрить два объекта в класс, чтобы затем использовать их в методе get. Конечно, когда я создаю

await fastify.get("/", async(req, reply)=>{this.queryBus...});

он работает правильно.

Подскажите, пожалуйста, возможно ли это сделать объектно-ориентированным способом?


person mkubasz    schedule 10.02.2020    source источник


Ответы (1)


Чтобы решить эту проблему, я использовал этот код из ответа пользователя Reddit.

function factory(controller) {
  return {
    get: async (req, reply) => controller.get(req, reply),
    post: async (req, reply) => controller.post(req, reply),
  };
}

export default async (fastify, opts, done) => {
  const { commandBus, queryBus } = fastify.di;
  const projectsController = new ProjectsController(queryBus, commandBus);
  await fastify.get("/", factory(projectsController).get);
  done();
};

person mkubasz    schedule 12.02.2020