我已经按照npm和github上的指南进行了逆向化,以在我的Typescript项目中配置依赖项注入。
我有一个控制器,一个服务和一个路由器。通过构造函数注入将服务注入到控制器中,然后将控制器直接从路由器内部的依赖项注入容器中拉出。
我收到一个'Cannot read property 'listingService' of undefined'
的错误。
似乎已访问控制器,但由于某种原因,当我尝试访问该服务时,发现它是undefined
。
有人可以问我问题所在吗?
提供我的工作所需的相关骨架代码如下:
// ts.config.json
{
"compileOnSave": true,
"compilerOptions": {
"target": "es5",
"lib": ["es6"],
"types": ["reflect-metadata"],
"module": "commonjs",
"moduleResolution": "node",
"experimentalDecorators": true,
"emitDecoratorMetadata": true
},
"include": ["typings.d.ts", "server/**/*.ts"],
"exclude": ["node_modules"]
}
// TYPES.ts
const TYPES = {
ListingController: Symbol.for("ListingController"),
ListingService: Symbol.for("ListingService")
};
export { TYPES };
// inversify.config.ts
import "reflect-metadata";
import { Container } from "inversify";
import {TYPES} from "./Types";
import {ListingController} from "./interfaces/ListingController";
import {ListingControllerImpl} from "../controllers/ListingControllerImpl";
import {ListingService} from "./interfaces/ListingService";
import {ListingServiceImpl} from "../services/ListingServiceImpl";
const myContainer = new Container();
myContainer.bind<ListingController>(TYPES.ListingController).to(ListingControllerImpl);
myContainer.bind<ListingService>(TYPES.ListingService).to(ListingServiceImpl);
export { myContainer };
// router.ts
import * as express from 'express';
const app = express();
import {myContainer} from "../d.i./inversify.config";
import {TYPES} from "../d.i./Types";
import {ListingController} from "../d.i./interfaces/ListingController";
const listingController = myContainer.get<ListingController>(TYPES.ListingController);
app.post('/', listingController.create);
export default app;
export interface ListingController {
create(req: Request, res: Response): void;
}
export interface ListingService {
create(body: any, id: string): Promise<any>;
}
@injectable()
export class ListingControllerImpl implements ListingController {
public listingService: ListingService;
constructor()
constructor(@inject(TYPES.ListingService) listingService: ListingService) {
this.listingService = listingService;
}
public create(req: Request, res: Response): void {
this.listingService.create();
}
}
@injectable()
export class ListingServiceImpl implements ListingService {
constructor()
constructor() {
}
public all(uid: string, page: number, size): Promise<any> {
//
}
public byId(id: string, uid: string): Promise<any> {
//
}
public create(body: any, userId: string): Promise<any> {
// do something
}
}
答案 0 :(得分:0)
好,所以我找到了问题。
这个问题实际上与依赖注入的选择或实现无关,但实际上我对闭包属性有一点误解。
当我尝试使用this.listingService.create()
从控制器调用listingService的create方法时,“ this”未指向控制器类的实例。
通过使用实例函数表示法,我可以访问我期望的范围,并且现在可以毫无问题地调用service方法。
public create = (req: Request, res: Response, next: NextFunction): void => {
this.listingService.create();
});
我希望这可以对某人有所帮助。