0

您好有一个带有 inversify 和 requirejs 的打字稿测试项目,可以从以下位置克隆:https ://github.com/ahedreville/ioctest.git

他的 package.json 如下

{
  "name": "ioctest",
  "version": "1.0.0",
  "description": "Test of an IoC with Inversify and RequireJS",
  "scripts": {
    "start": "http-server"
  },
  "author": "Alexandre Hedreville",
  "license": "ISC",
  "devDependencies": {
    "http-server": "^0.10.0"
  },
  "dependencies": {
    "@types/requirejs": "^2.1.30",
    "inversify": "^4.3.0",
    "reflect-metadata": "^0.1.10",
    "requirejs": "^2.3.4"
  }
}

您可以通过以下命令在浏览器上运行该项目...

mkdir temp
cd temp

git clone https://github.com/ahedreville/ioctest.git
cd ioctest

c:\temp\ioctest>tree /F /A

...
C:.
|   app.main.js
|   index.html
|   package.json
|   README.md
|   tsconfig.json
|
\---src
        App.js
        App.js.map
        App.ts
        ioc_config.js
        ioc_config.js.map
        ioc_config.ts
        Question.js
        Question.js.map
        Question.ts
        Question2.js
        Question2.js.map
        Question2.ts
        Types.js
        Types.js.map
        Types.ts
		
npm install

npm start

http://localhost:8080

如您所见,打开浏览器开发者控制台日志,接口 IProblem 被解析为 Question2 类,正如我们在类 ioc_config.ts 上要求的那样

Question2类如下

import { injectable } from "inversify";
import { IProblem } from './Types';

@injectable()
export class Question2 implements IProblem {
    public readonly factor: number = 0;
    public count: number = 0;
    public answer: number = 0;
}

但是如果我更改 ioc_config.ts 上的目标分辨率类

更改 ioc_config.ts 类如下

import { Container } from 'inversify';
import { sTypes, IProblem } from './Types';
import { Question } from './Question';
import { Question2 } from './Question2';

export const container = new Container();

//container.bind<IProblem>(sTypes.IProblem).to(Question2);
container.bind<IProblem>(sTypes.IProblem).to(Question);

现在 IProblem 接口的解析将失败,因为 Question.ts 有一个构造函数,它期望传递一些值。

问题类如下

import { injectable } from "inversify";
import { IProblem } from './Types';

@injectable()
export class Question implements IProblem {
    public answer: number = 0;
    constructor(public readonly factor: number, public readonly count: number) {
    }
}

我该如何解决这个问题(我是 inversify 的新手)并在解析时将一些值传递给构造函数?

4

1 回答 1

0

我的猜测是你需要一个工厂:

    interface Problem {
        factor: number;
        count: number;
    }

    interface ProblemFactory extends Function {
        (factor: number, count: number): Problem;
    }

    class Question implements Problem {
        public answer = 0;
        constructor(public readonly factor: number, public readonly count: number) {
        }
    }

    interface QuestionConstructor {
        new(factor: number, count: number): Question;
    }

    container.bind<QuestionConstructor>("QuestionConstructor").toConstructor(Question);

    container.bind<ProblemFactory>("ProblemFactory").toFactory<Problem>((context) => {
        return (factor: number, count: number) => {
            const Constructor =  context.container.get<QuestionConstructor>("QuestionConstructor");
            return new Constructor(factor, count);
        };
    });
于 2017-11-01T13:40:46.530 回答