При построении сервера 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
?