内部创建实例
通常TS某个类需要调用其它类的非静态方法,需要持有该类的实例引用,并且需要在内部创建类的实例。
class A {
method_1(){
// ...
}
}
class B {
// 持有A类的实例引用
private a: A
constructor(){
this.a = new A(); // 实例化
}
callAMethod_1() {
this.a.method_1();
}
}
但是这样耦合性较高,比如我想调用A的子类方法或者我想换成测试的MOCK实例,那么可能修改类B的代码.
依赖注入
另一种方式是我们可以采用依赖注入的方式。
核心是类内部不创建其它类的实例,而将类的实例传入。
class A {
method_2(){
// ...
}
}
class B {
private a: A
// 构造函数传入实例
constructor(a:A){
this.a = a;
}
}
内部创建实例和依赖注入适用场景对比
| 方法 | 适用场景 | 核心特点 |
|---|---|---|
| 类内创建实例 | 1.依赖类简单、无复杂配置;2.依赖不会变化(无子类替换需求);3.仅当前类使用该依赖 | 写法简单,耦合度搞,适用简单场景 |
| 依赖注入 | 1.依赖复杂(需配置参数)、可能有子类;2.需要单元测试(可以注入MOCK实例);3.依赖被多个类共享 | 耦合度低,灵活性可扩展,适合实例项目开发 |