使用依赖注入的TypeScript应用程序初始化

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

我正在使用Webpack GitHub repo构建一个TypeScript项目。默认情况下,应用程序允许依赖注入,我看不到安装了提供IoC的软件包,因此我只能假设TypeScript已经有某种基本的DI?我在TypeScript IoC容器上找不到文档。

我正在寻找的是设置应用程序初始化的一些方法,它不会使用new运算符创建一个荒谬的DI链。请参考以下示例:

class Stage {
  constructor(
    private light: Light,
  ) { }
}

class App {
  constructor(
    private stage: Stage,
  ) { }
}

class Init {
  constructor(
    private app: App,
  ) { }
}

const init: Init = new Init(new App(new Stage()));

好像我需要用旋转变压器做点什么?我是否必须安装像InversifyJS这样的东西来实现这一目标?

我确信下面的代码是可以实现的,但是如何告诉IoC容器解析Init的依赖?我有必要创建一个解析器吗?

const init: Init = new Init();
javascript typescript dependency-injection ioc-container
1个回答
1
投票

我最后遇到了同样的问题我最终使用的inversifyJS可以和Typescript一起使用。

图书馆非常密集,但它绝对可以满足您的需求。您首先需要安装以下内容:

npm install inversify reflect-metadata --save

并在您的tsconfig.json文件中进行以下更改:

{
    "compilerOptions": {
        "target": "es5",
        "lib": ["es6"],
        "types": ["reflect-metadata"],
        "module": "commonjs",
        "moduleResolution": "node",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true
    }
}

然后,使用上面的示例:

import { injectable, inject } from "inversify";
import "reflect-metadata";

@injectable()
class Stage {
  private light: Light;

  constructor(
    @inject(Light) light: Light,
  ) { 
     this.light = light;
  }
}

@injectable()
class App {
  private stage: Stage;
  constructor(
    @inject(Stage) stage: Stage,
  ) { 
     this.stage = stage;
  }
}

@injectable()
class Init {
  private app: App;
  constructor(
    @inject(App) app: App
  ) { 
    this.app = app;
  }
}

然后,您应该创建一个inversify.config.ts文件。这是你的所有依赖注入:

import 'reflect-metadata';
import { Container } from "inversify";
// import all of the Stage/Light/etc. classes also

let DIContainer = new Container();
DIContainer.bind<Stage>(Stage).toSelf();
DIContainer.bind<Light>(Light).toSelf();


export default DIContainer;

最后,转到实例化Init类的文件,并将其更改为以下内容:

import 'reflect-metadata';
import DIContainer from '../src/dependencies';
// import Init class as well

const init: Init = DIContainer.resolve<Init>(Init);

我很可能忘记某些东西或者某处有虫子,但这是主要的想法。希望这可以帮助。

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