Я использую 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.
Я не инициализировал данные верхнего и нижнего колонтитула, пока они не понадобятся в первый раз. Я проверяю, загружен ли, если нет, я загружаю его. Тем не менее, это всего лишь обходной путь, и кажется, что это та проблема, которую важно знать, как решить ее чистым способом.