【问题标题】:Inversify dependency injection not injecting dependencies into constructor反转依赖注入不将依赖注入构造函数
【发布时间】:2019-04-20 02:59:57
【问题描述】:

我已按照 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 "../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
    }
}

【问题讨论】:

    标签: typescript dependency-injection dependencies inversifyjs


    【解决方案1】:

    好的,所以我发现了问题。

    这个问题实际上与依赖注入的选择或实现无关,但实际上是我对闭包属性的一点误解。

    当我尝试使用this.listingService.create()从控制器调用listingService的create方法时,'this'没有指向控制器类的实例化。

    通过使用实例函数表示法,我获得了对预期范围的访问权限,现在可以毫无问题地调用服务方法。

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

    我希望这可以帮助某人。

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2018-06-17
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多