如何在打字稿中使用依赖注入?
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 启发的内置依赖倒置。
我尝试在打字稿代码中添加依赖注入,它工作正常。但我需要在依赖注入中加载快速应用程序。
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 启发的内置依赖倒置。