初始化另一个服务后,如何在Inverse中绑定服务?

时间:2019-06-26 13:28:39

标签: node.js typescript inversion-of-control inversifyjs

我使用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加载的查询。 我要做的是直到第一次需要它时才初始化页眉和页脚数据。我检查是否已加载,如果没有加载。但是,这只是一个变通办法,感觉这是一种知道如何以干净的方式解决的问题很重要。

0 个答案:

没有答案