Javascript 使用带有Express控制器基和子类的InversifyJs进行依赖项注入

Javascript 使用带有Express控制器基和子类的InversifyJs进行依赖项注入,javascript,node.js,typescript,express,inversifyjs,Javascript,Node.js,Typescript,Express,Inversifyjs,我的第一个目标是避免重复我自己。我正在创建一个Node.js express服务器。我想创建几个类控制器,每个都有自己的路由,并且都具有完全相同的CRUD功能:获取单个记录、获取所有记录、更新单个记录、删除记录、发布数据库中每个数据对象的新记录,但我希望能够扩展这些控制器,在这些控制器的基础上添加额外的功能 我的第二个目标是使用依赖注入来在这些控制器中使用数据库服务 问题是当我将TypeScript编译器注入基类构造函数时,它会感到不安。现在需要我将其添加到子类构造函数中 // THE BAS

我的第一个目标是避免重复我自己。我正在创建一个Node.js express服务器。我想创建几个类控制器,每个都有自己的路由,并且都具有完全相同的CRUD功能:获取单个记录、获取所有记录、更新单个记录、删除记录、发布数据库中每个数据对象的新记录,但我希望能够扩展这些控制器,在这些控制器的基础上添加额外的功能

我的第二个目标是使用依赖注入来在这些控制器中使用数据库服务

问题是当我将TypeScript编译器注入基类构造函数时,它会感到不安。现在需要我将其添加到子类构造函数中


// THE BASE CLASS
import { inject } from "inversify";
import db from "../db";

export default class Controller {

    protected _db: db;
    public path: string;
    public router = Router();

    constructor(path: string, @inject(db) databbase: db) {
        this._db = databbase;
        this.path = path; // path for my special record
        this.initializeRoutes();
    }

    public initializeRoutes(): void {
        this.router.get(this.path + '/:id', this.getRecordById);
    }

    getRecordById = async (req: Request, res: Response): Promise<boolean>  => {
        const { rows } = await this._db.query('SELECT * FROM issues WHERE id = $1', [req.params.id]);
      
        res.send(rows.pop());
        return Promise.resolve(true);
    }
}

//基层
从“inversify”导入{inject};
从“./db”导入数据库;
导出默认类控制器{
受保护的_db:db;
公共路径:字符串;
公共路由器=路由器();
构造函数(路径:字符串,@inject(db)数据库:db){
这个。_db=数据库;
this.path=path;//我的特殊记录的路径
this.initializeRoutes();
}
公共初始值设定项outes():void{
this.router.get(this.path+'/:id',this.getRecordById);
}
getRecordById=async(请求:请求,响应:响应):承诺=>{
const{rows}=wait this.db.query('SELECT*FROM issues,其中id=$1',[req.params.id]);
res.send(rows.pop());
返回承诺。解决(真实);
}
}
//子类
从“inversify”导入{inject};
从“./db”导入数据库;
从“/Controller”导入控制器;
导出默认类控制器{

构造函数(路径:字符串,@inject(db)_db:db){/@EstusFlask我明白。我会试试这个。我想这个DI的东西现在正让我大吃一惊。使用注入器的意义在于,你不需要手动实例化类,而是允许注入器这样做。在你的情况下,你可能根本不需要Inversify。你可以在子类中省略一个dep,但前提是你省略了一个构造函数(它是从父级继承的)。不应该有“path:string”之类的内容在DI类中,它们应该只在构造函数中接收有效的DI DEP是的,如果使用@injectable@EstusFlask,则不需要@injection。因此,使用注入依赖项的类不能以其他方式将任何其他值引入构造函数?…因此,在使用依赖项注入的应用程序中,几乎所有内容都是服务。Hmmmm。我有感谢你,Estus。你需要另一个服务(工厂函数)来为类提供参数。在你的情况下,你可以使用依赖注入模式,而无需通过执行“new IssueController(“issues”,dbForIssue)”来反转容器,大多数情况下都是这样。我很难证明在中小型节点应用程序中使用DI容器是合理的。这会导致过度设计的应用程序而没有明显的好处。你可以在实践中使用Nestjs中的Express检查DI的外观。它体积庞大且富有进取心。
// THE SUBCLASS
import { inject } from "inversify";
import db from "../db";
import Controller from "./Controller";


export default class SubController extends Controller {

    constructor(path: string, @inject(db) _db: db) { // <-- Do I have to inject it here, as well?
        super(path, _db);
    }

    // I will add additional methods here, unique to my SubController

}