服务的松耦合与紧耦合

Mun*_*erz 1 coupling loose-coupling angular

我知道我们几乎一直都希望在应用程序中的组件之间实现松散耦合以及为什么。

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

export class Test(){

dataResults;

constructor(service: testService){

this.dataResults = service.getData()

}

}
Run Code Online (Sandbox Code Playgroud)

Pra*_*ana 6

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

service:TestService;
constructor(){
this.service = new TestService();
this.dataResults = service.getData()
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是紧耦合,因为如果明天如果我想更换TestServiceActualService,我不得不被消耗打开的文件TestService和必须做的修改。

现在,松耦合是反向紧耦合的,手段类是不直接依赖于它的服务消费它的类。在像 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 { }
Run Code Online (Sandbox Code Playgroud)

所以现在一个 id 依赖于 IB ,你可以很容易地做到这一点

A a = new A(new B());
or 
A a = new A(new C());
Run Code Online (Sandbox Code Playgroud)

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


现在来看看你的代码是哪个 Angular 代码,

在 angular 中,当我们在 out 组件中使用任何服务时,我们确实通过在模块或组件中的提供者注册它。

[{ provide: Logger , useClass: Logger}]
Run Code Online (Sandbox Code Playgroud)

然后在它使用的组件中

constructor(service: Logger){
  this.dataResults = service.getData()
}
Run Code Online (Sandbox Code Playgroud)

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

[{ provide: Logger , useClass: BetterLogger}]
or 
[{ provide: Logger , useClass: TestLogger}]
Run Code Online (Sandbox Code Playgroud)

没有进入组件代码,这就是它如何变得松散耦合。甚至它的部件测试的还,其中一个要替换actul服务非常有用MockService(这里检查:https://angular.io/guide/testing

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

进一步阅读:依赖注入SOLID