簡體   English   中英

反向依賴注入,而不是將依賴注入到構造函數中

[英]Inversify dependency injection not injecting dependencies into constructor

我已按照 npm 和 github 上的指南進行 inversify 配置,以在我的 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 "../di/inversify.config"; import {TYPES} from "../di/Types"; import {ListingController} from "../di/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 } }

好的,所以我發現了問題。

這個問題實際上與依賴注入的選擇或實現無關,但實際上是我對閉包屬性的一個輕微誤解。

當我嘗試使用this.listingService.create()從控制器調用listingService 的 create 方法時,'this' 沒有指向控制器類的實例化。

通過使用實例函數表示法,我獲得了對預期范圍的訪問權限,現在可以毫無問題地調用服務方法。

 public create = (req: Request, res: Response, next: NextFunction): void => { this.listingService.create(); });

我希望這可以幫助某人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM