【发布时间】:2019-08-27 17:42:56
【问题描述】:
我创建了一个小项目来展示这个问题。
此项目中有 5 个文件。 一个包含所有依赖注入的容器文件;包含我需要运行的功能的服务文件;一个控制器文件,它调用服务文件中的函数;一个app文件,它是最高级别的应用程序,它将调用所有的控制器文件,在这个例子中只有1个;一个 index.js 文件,它是应用程序的起点。
container.js:
const {
createContainer,
asValue,
asFunction,
asClass,
} = require('awilix');
const container = createContainer();
const Controller = require('./controller');
const Service = require('./service');
container.register({
controller: asClass(Controller).singleton(),
service: asClass(Service).singleton(),
})
const App = require('./app');
container.register({
app: asClass(App).singleton(),
})
module.exports = container;
service.js:
module.exports = class Service {
doService() {
return new Promise(resolve => {
setTimeout(() => resolve("Hello from service!"), 2000);
});
}
}
controller.js:
module.exports = class Controller {
constructor({ service }) {
this.service = service;
}
doWork() {
this.service.doService().then(response => {
this.message = response;
return this.message;
})
}
}
app.js:
module.exports = class App {
constructor({ controller }) {
this.controller = controller;
}
async start() {
try {
this.doc = await this.controller.doWork();
} catch (err) {
}
console.log(this.doc);
}
}
index.js:
const container = require('./container');
const app = container.resolve('app');
app.start();
我的目标是我可以看到 app.js 中的 doc 属性变为“Hello from service!”并能够 console.log 将其注销。调用顺序应该是:
index.js --> app.js --> controller.js --> service.js --> controller.js --> app.js
所有依赖都使用 awilix js 注入到 container.js 中。
我很确定我在 controller.js 中将其从 promise return 它搞砸了,因为如果我使用其他同步功能,它就可以工作。
请告诉我为什么我错了,如何让它发挥作用。
【问题讨论】:
标签: javascript node.js dependency-injection promise ioc-container