如何在打字稿中使用依赖注入?

How to use dependency injection in typescript?

我尝试在打字稿代码中添加依赖注入,它工作正常。但我需要在依赖注入中加载快速应用程序。

Dependencies.ts

import { injectable } from 'inversify';

@injectable()
export class DependencyA{
    public getName(){
        return "dependencyA"
    }
}

@injectable()
export class DependencyB{
    public getName(){
        return "dependencyB"
    }
}

Service.ts

import {injectable} from 'inversify';
import { DependencyA,DependencyB } from './dependencies';

@injectable()
export class Service{
    dependencya: DependencyA;
    dependencyb: DependencyB;
    constructor(dependencya:DependencyA,dependencyb:DependencyB){
        this.dependencya = dependencya;
        this.dependencyb = dependencyb

    }

    public getAllName(){
        return this.dependencya
    }
}

main.ts

import 'reflect-metadata'
import { Service } from './service';
import {container} from 'tsyringe';

const service = container.resolve(Service)  
console.log(service.getAllName)

如何在依赖注入中加载express app并在依赖构造函数中传递参数

我会确保您在整个应用程序中坚持使用 inversify,并使用 inversify 的 Container 而不是来自 tsyringe.

的容器

我还会向您指出这个包 (https://github.com/inversify/inversify-express-utils),我在使用 DI 的基于服务的快速应用程序的生产中成功使用了它。

您可以创建一个 InversifyExpressServer 将其传递给您的反向容器和您的自定义 Express 应用程序,就像这样

const container = new Container();

container.bind<MyServiceA>(TYPES.MyServiceA).to(MyServiceA)
container.bind<MyServiceB>(TYPES.MyServiceB).to(MyServiceB)

const app = express();

// apply middleware
app.use(middleware)

// any regular functional express routes
app.use('/', controllerFunc)

...etc etc

const server = new InversifyExpressServer(container, null, null, app);

InversifyExpressServer 将为您解析您的 ioc root 并注册您的所有控制器,您所要做的就是将您的服务绑定到容器。然后这些服务将可供 @inject 使用并在您的控制器(或其他服务)中使用

@controller("/names")
export class NamesController extends HttpBaseController {
    @inject(TYPES.MyServiceA) private myServiceA!: MyServiceA

    @httpGet("/")
    private index(): string {
        return this.myServiceA.getAllNames();
    }
}

它可以很好地与现有应用程序集成。我目前正在使用此 inversify 包将具有约 100 个端点的 express 应用程序从普通 js express 应用程序迁移到 ts 应用程序。由于您可以将 InversifyExpressServier 传递给自定义应用程序,因此您可以在重构它们之前保持所有旧路由的完整功能。

或者,如果您的项目是新项目,我建议您查看 Nestjs (https://nestjs.com/)。它是一个基于 express 构建的框架,具有受 angular 启发的内置依赖倒置。