【发布时间】:2017-08-11 04:01:49
【问题描述】:
根据official document,似乎只要我们保持基于对象的结构,我们就可以使用依赖注入功能。
这是我的问题。我正在使用 TypeScript 来实现这个目标(基于类)。我将使用Inversify 作为 IoC 容器。我最初的想法是这样的:
DependencyConfig.ts:
import { Container } from "inversify";
import "reflect-metadata";
import Warrior from "./interfaces/Warrior";
import { Ninja } from "./models/Warrior";
let container = new Container();
container.bind<Warrior>(Symbol("Warrior")).to(Ninja);
export default container;
App.ts:
import container from "./DependencyConfig";
@Component({
name: "App",
provide: container
})
export default class App extends Vue {
}
当我检查浏览器的开发控制台时,我能够看到 container 已设置为 _provided 字段。这里是Hello.ts,App.ts的子组件:
Hello.ts:
@Component({
name: "Hello",
inject: [ "container" ]
})
export default class Hello extends Vue {
created (): void {
console.log(this);
}
}
由于App.ts 可以通过vue-router 访问Hello.ts,它没有将Hello.ts 注册为子组件。我期待注入的容器应该出现在_injected 或类似的东西上。但是,我找不到它。我将inject 属性值从"container" 更改为{ "container": Symbol("Container") },但还是找不到。
服务定位器:
使用服务定位器代替provide/inject 对可以正常工作:
// App.ts
@Component({
name: "App"
})
export default class App extends Vue {
}
// Hello.ts
import container from "./DependencyConfig";
@Component({
name: "Hello"
})
export default class Hello extends Vue {
created (): void {
var ninja = container.get<Ninja>(Symbol("Warrior"));
console.log(ninja.name);
}
}
但是,我想避免在这里使用服务定位器模式。我在使用 provide/inject 对进行依赖注入时是否遗漏了什么?
【问题讨论】:
标签: typescript dependency-injection vue.js