Как я могу связать сервис в inversify после инициализации другого сервиса? - PullRequest
0 голосов
/ 26 июня 2019

Я использую Inversify, и у меня есть код, который выглядит следующим образом:

export const bindings = new AsyncContainerModule(async (bind) => {

await require("./controllers/BaseController");
await require("./controllers/ContentController");

bind<CssLoader>(TYPE.CssLoader).to(CssLoader).inSingletonScope();
bind<GQLQueryLoader>(TYPE.GQLQueryLoader).to(GQLQueryLoader).inSingletonScope();
bind<GQLRepository>(TYPE.GQLRepository).to(GQLRepository).inSingletonScope();
bind<ArticleRenderer>(TYPE.ArticleRenderer).to(ArticleRenderer).inSingletonScope();
bind<GuideRenderer>(TYPE.GuideRenderer).to(GuideRenderer).inSingletonScope();
bind<RendererFactory>(TYPE.RendererFactory).to(RendererFactory).inSingletonScope();
bind<HeaderAndFooterManager>(TYPE.HeaderAndFooterManager).to(HeaderAndFooterManager).inSingletonScope();});

Моя проблема в том, что мне нужно, чтобы HeaderAndFooterManager был зарегистрирован только после регистрации GQLQueryLoader, потому что он использует запросы только после их загрузки.

Контейнер используется в приложении следующим образом:

(async () => {
const staticServer = express();
staticServer.use(express.static(path.join(__dirname, 'public')));

staticServer.engine('handlebars', exphbs({  }));
staticServer.set('view engine', 'handlebars');
staticServer.set('views', path.join(__dirname, '..', 'views'));


const PORT = process.env.PORT || 3000;
const container = new Container();
await container.loadAsync(bindings);

const app = new InversifyExpressServer(container, null, null, staticServer);
const server = app.build();

server.listen(PORT, () => {
    console.log(`Server running on port ${PORT}/`)
}); })();

Редактировать >>> Проблема заключается в том, что обе службы должны инициализировать некоторое состояние в конструкторе при запуске сервера. GQLQueryLoader должен загружать запросы с диска и предоставлять к ним доступ, поэтому мне не нужно читать с диска при каждом запросе, а HeaderAndFooterManager необходимо выполнить некоторые запросы в конструкторе, чтобы кэшировать результат при запуске сервера, чтобы Я храню эту информацию в памяти, но ей нужен доступ к загруженным запросам GQLQueryLoader. Я не инициализировал данные верхнего и нижнего колонтитула, пока они не понадобятся в первый раз. Я проверяю, загружен ли, если нет, я загружаю его. Тем не менее, это всего лишь обходной путь, и кажется, что это та проблема, которую важно знать, как решить ее чистым способом.

...