我想在 inversify 中使用 Express+Typescript 来使用自定义 Express 路线
所以代码如下:
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);
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 };
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()
}
}
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 一样处理
请帮忙解决这个问题
使用 inversify 时,你不应该实例化一个类,你可以这样做
let productCont = container.get(ProductController)
Router.get('/',productCont.get);
在上面你得到了 ProductController 但是 ProductService
会发生什么在容器中,您可以为您的类定义范围。 我发现您没有为类设置任何范围,因此默认情况下它们都在 TransiantScope 中,因此每次调用 ProductController 时,都会为 ProductService
创建一个新实例如果您想了解有关示波器的更多信息,请查看此处
另外我建议您阅读 container API 以更多地了解它是如何工作的