紧耦合意味着:编写的代码仅依赖于一个类,例如,如果我编写了
service:TestService;
constructor(){
this.service = new TestService();
this.dataResults = service.getData()
}
上面的代码是紧密耦合的,因为如果明天我想用ActualService 替换TestService,我必须打开正在消耗TestService 的文件并且必须进行修改。
现在,Loose Coupling 与紧耦合相反,意味着类不直接依赖于它所使用的服务的类。在像 C# 这样的高阶语言中,松散耦合的代码是这样写的
public class A{
A(IB service) {//here IB is interface , on which A class is depedant
//use service here
}
}
public class B : IB { }
public class C : IB { }
所以现在 A id dedpend on IB ,你可以轻松做到这一点
A a = new A(new B());
or
A a = new A(new C());
因此它创建了 A 依赖于可以是 B 或 C 的 IB。因此它与 B 和 C 松散耦合。
现在来看看你的代码是哪个 Angular 代码,
在 Angular 中,当我们在 out 组件中使用任何服务时,我们会通过提供者在模块或组件中注册它。
[{ provide: Logger , useClass: Logger}]
然后在组件中像
一样使用
constructor(service: Logger){
this.dataResults = service.getData()
}
现在明天如果我想用 BetterLoger 替换 Logger,我只需要这样做
[{ provide: Logger , useClass: BetterLogger}]
or
[{ provide: Logger , useClass: TestLogger}]
没有进入组件代码,这就是它变得松散耦合的方式。甚至它在测试组件方面也非常有帮助,如果你想用MockService 替换实际服务(在这里查看:https://angular.io/guide/testing)
上面的工作BetterLogger and TestLogger必须扩展Logger。你可以去那里详细查看:https://angular.io/guide/dependency-injection
进一步阅读:Dependency Injection 和 SOLID