据我所知,我们几乎所有时候都希望在应用程序和组件之间实现组件之间的松散耦合。这是为什么。
但是在下面的示例中,如果有人可以澄清为什么当我们将服务作为参数传递给构造函数时它没有紧密耦合,这样我就能理解下面的逻辑。罩。
export class Test(){
dataResults;
constructor(service: testService){
this.dataResults = service.getData()
}
}
答案 0 :(得分:4)
紧密耦合意味着:编写的代码仅依赖于一个类,例如,如果我写
service:TestService;
constructor(){
this.service = new TestService();
this.dataResults = service.getData()
}
上面的代码是紧密耦合的,因为如果明天如果我想用TestService
替换ActualService
,我必须打开消耗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,它可以是B或C.因此它与B和C松散耦合。
现在来看你的代码Angular代码,
当我们在out组件中使用任何服务时,我们会在模块或组件上通过提供者注册它。
[{ 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 and TestLogger
必须延长Logger
。你可以去那里查看详细信息:https://angular.io/guide/dependency-injection
进一步阅读:Dependency Injection和SOLID