- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道我们几乎总是希望在应用程序中实现组件之间的松散耦合以及原因。
但在下面的示例中,如果有人可以澄清为什么当我们将服务作为参数传递给构造函数时它没有紧密耦合,那么我就可以理解幕后发生的逻辑。
export class Test(){
dataResults;
constructor(service: testService){
this.dataResults = service.getData()
}
}
最佳答案
紧耦合意味着:编写的代码只依赖于一个类,例如如果我写
service:TestService;
constructor(){
this.service = new TestService();
this.dataResults = service.getData()
}
上面的代码是紧密耦合的,因为如果明天我想用 ActualService
替换 TestService
,我必须打开消耗 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 { }
所以现在 A id 依赖于 IB,你可以很容易地做到这一点
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
替换 actul 服务(在此处查看:https://angular.io/guide/testing)
要使上述BetterLogger 和TestLogger
正常工作,必须扩展Logger
。你可以去那里详细查看:https://angular.io/guide/dependency-injection
进一步阅读:Dependency Injection和 SOLID
关于angular - 服务的松耦合与紧耦合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50772612/
我是一名优秀的程序员,十分优秀!