【问题标题】:Loose coupling vs tight coupling of services服务的松耦合与紧耦合
【发布时间】:2018-11-19 05:18:49
【问题描述】:

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

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

export class Test(){

dataResults;

constructor(service: testService){

this.dataResults = service.getData()

}

}

【问题讨论】:

  • 你想知道它是否松耦合
  • 我不清楚你在这里真正问的是什么。 “幕后”是 Angular 的依赖注入系统,它是一个特定的实现,而不是一个广泛的架构原则。您可能会争辩说 Test 仍然依赖于 TestService,但是这里的依赖倒置和构造函数注入意味着您可以交换服务(例如用于测试),从而减少耦合,因为 Test 不会创建自己的具体 TestService。您可能应该阅读angular.io/guide/dependency-injection-pattern

标签: angular loose-coupling coupling


【解决方案1】:

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

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 InjectionSOLID

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 2013-12-25
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2013-11-27
    • 2011-02-01
    相关资源
    最近更新 更多