【发布时间】:2023-02-16 21:23:17
【问题描述】:
我使用 express 和 typescript 开始了一个新项目,我正在尝试使用 inversifyJS 设置 DI 容器。 它应该是非常简单的用例,只有 1 个路由和控制器 到目前为止我的文件:
控制器\项目\项目.控制器
import { inject, injectable } from "inversify";
import "reflect-metadata";
import { IProjectService } from "../../services/projects/interface/IProjectService";
import { TYPES } from "../../services/projects/types";
@injectable()
class ProjectController {
private _processService: IProjectService;
constructor(@inject(TYPES.IProjectService) projectServicee: IProjectService) {
this._processService = projectServicee;
}
public getProjects(): string {
return this._processService.getProject();
}
}
export { ProjectController };
服务\项目\imp\ProjectService.ts
import { injectable } from "inversify";
import "reflect-metadata";
import { IProjectService } from "../interface/IProjectService";
@injectable()
class ProjectServicee implements IProjectService {
getProject(): string {
return "Project A";
}
}
@injectable()
class ProjectService implements IProjectService {
getProject(): string {
return "Project B";
}
}
export { ProjectServicee, ProjectService };
服务\项目\接口\IProjectService.ts
export interface IProjectService {
getProject(): string;
}
路线\项目.ts在这里,我向容器询问 ProjectController 的实例并按预期获取它,但是其中的 IProjectService 的私有实例在运行时未定义
import { myContainer } from "../../inversify.config";
import { ProjectController } from "../controllers/projects/projects.controller";
import { CONTROLLERS_TYPES } from "../controllers/types";
import * as express from "express";
const router = express.Router();
const pc = myContainer.get<ProjectController>(
CONTROLLERS_TYPES.ProjectController
);
router.get("/", pc.getProjects);
export default router;
根\inversify.config.ts
import { Container } from "inversify";
import { TYPES } from "./src/services/projects/types";
import { IProjectService } from "./src/services/projects/interface/IProjectService";
import { ProjectService } from "./src/services/projects/imp/ProjectService";
import { CONTROLLERS_TYPES } from "./src/controllers/types";
import { ProjectController } from "./src/controllers/projects/projects.controller";
const myContainer = new Container();
myContainer
.bind<ProjectController>(CONTROLLERS_TYPES.ProjectController)
.to(ProjectController);
myContainer.bind<IProjectService>(TYPES.IProjectService).to(ProjectService);
export { myContainer };
控制器\类型.ts
const CONTROLLERS_TYPES = {
ProjectController: Symbol.for("ProjectController"),
};
export { CONTROLLERS_TYPES };
服务\项目\types.ts
const TYPES = {
IProjectService: Symbol.for("IProjectService"),
};
export { TYPES };
最后是我的主要内容:
import projectRoutes from "./routes/projects";
import express from "express";
const app = express();
app.get("/", function (req, res) {
res.send("Hello World");
});
app.use("/api/projects", projectRoutes);
console.log("Listening on port 3000");
app.listen(3000);
现在,当尝试调用控制器的 get 方法时,出现错误:Cannot read properties of undefined (reading '_processService')
这意味着控制器中 _processService 的初始化没有工作,我错过了什么?
【问题讨论】:
-
根据 inversifyJS documentation,
reflect-metadata应该由消费者在整个应用程序中只导入一次。在你的情况下,我会说是routes\projects.ts。您正在将其导入所有@injectable类。但是,IDK 如果这是您问题的原因。
标签: typescript dependency-injection inversifyjs