我想在typescript inversify和express中使用express路线

问题描述 投票:0回答:1

我想在 inversify 中使用 Express+Typescript 来使用自定义 Express 路线

所以代码如下:

应用程序.ts

import 'reflect-metadata';
import { InversifyExpressServer } from 'inversify-express-utils';
import { appConfig } from "./config"
import { container } from './container';
import * as bodyParser from 'body-parser';
import  Router from "./router"


let server = new InversifyExpressServer(container,Router,null,null,null,false);

server.setConfig((app) => {
    app.use(bodyParser.urlencoded({
      extended: true
    }));
    app.use(bodyParser.json());
  });

let serverInstance = server.build();
serverInstance.listen(3000);

容器.ts

import { Container } from 'inversify';
import { IProductService, ProductService } from './infrastructures/services/product.service';
import TYPES from './types';
import { ProductController, IProductController } from './controllers/product.controller';

let container = new Container();
container.bind<IProductService>(TYPES.ProductService).to(ProductService);
container.bind<IProductController>(TYPES.ProductController).to(ProductController);
export { container };

产品控制器.ts

import { IProduct, ProductService } from "../infrastructures/services/product.service";
import TYPES from "../types";
import { inject, injectable } from "inversify";

export interface IProductController{
    get(): IProduct[]
}

@injectable()
export  class ProductController  implements IProductController{

    constructor(@inject(TYPES.ProductService) private productService: ProductService ) {}
    get(): IProduct[]{
        
        return this.productService.getProduct()
    }
    
}

路由器.ts

import express  from "express"; 
import { ProductController } from "./product.controller";
import { ProductService } from "../infrastructures/services/product.service"
    

const Router = express.Router();  
let productCont = new ProductController(new ProductService);  
Router.get('/',productCont.get);
export default Router

我 router.ts 我创建了如下对象:

let productCont = new ProductController(new ProductService);  
Router.get('/',productCont.get);

所以我不想创建对象,inversify 应该像 ProductController.ts 一样处理

请帮忙解决这个问题

node.js typescript express inversion-of-control inversifyjs
1个回答
0
投票

使用 inversify 时,你不应该实例化一个类,你可以这样做

let productCont = container.get(ProductController)
Router.get('/',productCont.get);

在上面你得到了 ProductController 但是 ProductService

会发生什么

在容器中,您可以为您的类定义范围。 我发现您没有为类设置任何范围,因此默认情况下它们都在 TransiantScope 中,因此每次调用 ProductController 时,都会为 ProductService

创建一个新实例

如果您想了解有关示波器的更多信息,请查看此处
另外我建议您阅读 container API 以更多地了解它是如何工作的

© www.soinside.com 2019 - 2024. All rights reserved.