首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务的松耦合与紧耦合

服务的松耦合与紧耦合
EN

Stack Overflow用户
提问于 2018-06-09 09:02:31
回答 1查看 4.1K关注 0票数 1

我理解,我们几乎总是希望在应用程序中实现组件之间的松散耦合&为什么。

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

代码语言:javascript
复制
export class Test(){

dataResults;

constructor(service: testService){

this.dataResults = service.getData()

}

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 09:32:58

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

代码语言:javascript
复制
service:TestService;
constructor(){
this.service = new TestService();
this.dataResults = service.getData()
}

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

现在,松散耦合与紧耦合相反,这意味着类不直接依赖于它所消耗的服务的类。在高级语言(如C# )中,松散耦合代码如下所示

代码语言:javascript
复制
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 { }

所以现在id dedpend在IB上,您可以很容易地做到这一点。

代码语言:javascript
复制
A a = new A(new B());
or 
A a = new A(new C());

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

现在我们来看看你的代码,

在角度上,当我们使用out组件中的任何服务时,我们都会通过提供者在模块或组件上注册它。

代码语言:javascript
复制
[{ provide: Logger , useClass: Logger}]

然后在组件中使用

代码语言:javascript
复制
constructor(service: Logger){
  this.dataResults = service.getData()
}

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

代码语言:javascript
复制
[{ 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

进一步阅读:依赖注入实心

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50772612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档