服务的松耦合与紧耦合

2024-04-21

我知道我们几乎总是希望在应用程序内的组件之间实现松散耦合以及原因。

但在下面的示例中,如果有人可以澄清为什么当我们将服务作为参数传递给构造函数时它没有紧密耦合,这样我就可以理解幕后发生的逻辑。

export class Test(){

dataResults;

constructor(service: testService){

this.dataResults = service.getData()

}

}

紧耦合方式:编写的代码仅依赖于一个类,例如如果我写

service:TestService;
constructor(){
this.service = new TestService();
this.dataResults = service.getData()
}

上面的代码是紧密耦合的,因为如果明天我想替换TestService with ActualService,我必须打开正在消耗的文件TestService并且必须做修改。

Now, 松耦合与紧耦合相反,意味着类不直接依赖于它所使用的服务的类。在像 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 { }

所以现在 Acid 取决于 IF ,你可以轻松做到这一点

A a = new A(new B());
or 
A a = new A(new C());

因此它创建了 A 依赖于 IB,IB 可以是 B 或 C。因此它与 B 和 C 松散耦合。


现在来看你的代码,即 Angular 代码,

在 Angular 中,当我们在组件中使用任何服务时,我们会通过提供者在模块或组件处注册它。

[{ provide: Logger , useClass: Logger}]

然后在组件中使用如下

constructor(service: Logger){
  this.dataResults = service.getData()
}

现在明天如果我想用 BetterLooger 替换 Logger 我只需要这样做

[{ provide: Logger , useClass: BetterLogger}]
or 
[{ provide: Logger , useClass: TestLogger}]

无需进入组件代码,这就是它变得松散耦合的方式。或者甚至它在组件测试中也非常有帮助,在这种情况下,人们想用MockService(检查这里:https://angular.io/guide/testing https://angular.io/guide/testing)

为了上面的工作BetterLogger and TestLogger必须延长Logger。你可以去那里详细检查:https://angular.io/guide/dependency-injection https://angular.io/guide/dependency-injection

进一步阅读:依赖注入 https://pranayamr.blogspot.com/2014/01/dependency-injection-part-1.html and SOLID https://pranayamr.blogspot.com/2015/07/solid-principle-in-detail.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务的松耦合与紧耦合 的相关文章