我使用inverseify,并且我有一些看起来像这样的代码:
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();});
我的问题是我只需要在注册GQLQueryLoader之后才注册HeaderAndFooterManager,因为它仅在查询加载后才使用。
容器在应用程序中的使用方式如下:
(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加载的查询。 我要做的是直到第一次需要它时才初始化页眉和页脚数据。我检查是否已加载,如果没有加载。但是,这只是一个变通办法,感觉这是一种知道如何以干净的方式解决的问题很重要。