代码之家  ›  专栏  ›  技术社区  ›  apostrophedottilde

反向依赖注入不将依赖注入构造函数

  •  0
  • apostrophedottilde  · 技术社区  · 7 年前

    我已经按照npm和github for 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
        }
    }
    1 回复  |  直到 7 年前
        1
  •  0
  •   apostrophedottilde    7 年前

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

    当我尝试使用从控制器调用listingService的create方法时 this.listingService.create()

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

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

    推荐文章