Где внедрить сервисы с ограниченным объемом запросов в GraphQL? - PullRequest
0 голосов
/ 04 марта 2020

При построении сервера GraphQL каждый распознаватель получает четыре параметра, включая объект Context, который содержит информацию о контексте для текущего запроса. Это кажется отличным местом для предоставления резолверам сервисов, необходимых им для выполнения их функций, таких как, например, UserService или UserCommentsService, наряду с такими утилитами, как Authorization, Logger, TraceData и c.

Однако, по мере роста списка служб контекстный объект будет расти вместе с ним, что в конечном итоге приведет к чрезмерному увеличению Context с десятками или даже сотнями служб, что усложнит работу с ним.

Т.е.

@injectable()
export class Context {
  public authorization: Authorization;
  public userService: UserService;
  public userCommentService: UserCommentService;
  public logger: ILogger;
  public traceData: TraceData;

  public constructor(
    @inject(TYPES.Authorization) authorization: Authorization,
    @inject(DATA.TraceData) traceData: TraceData,
    @inject(TYPES.Logger) logger: ILogger,
    // services
    @inject(TYPES.UserService) userService: UserService,
    @inject(TYPES.UserCommentService) userCommentService: UserCommentService,
    // many more to come
  ) {
    this.authorization = authorization;
    this.traceData = traceData;
    this.logger = logger;

    this.userService = userService;
    this.userCommentService = userCommentService;
  }
}

Как можно справиться с этим лучше всего? Одним из способов было бы внедрить объект services, который затем содержал бы список служб и позволял бы использовать его в соответствии с ctx.services.userService.someMethod(), но я не уверен, является ли это наилучшим подходом или существует ли умнее?

TL; DR - Как лучше всего обеспечить внедрение зависимостей с учетом контекста в распознаватели GraphQL без раздувания объекта Context?

...