我想弄清楚为什么我们需要Angular2依赖注入。使用测试的情况很清楚:我们可以很容易地模拟任何服务。但你能提供其他原因吗?
使用DI可以获得更好的体系结构,其中类之间的耦合更加松散。这也是这样的代码可测试性更好的原因。
DI不仅允许轻松地模拟服务,还允许轻松地为生产场景配置。
您可以提供不同的配置值或服务实现,只需更改一个文件,但影响整个应用程序。
因此,使测试更容易的主要优点也具有测试之外的优点。
abstract class ConfigBase {
get someConfigValue():number;
}
@Injectable()
class MyConfig1 extends ConfigBase {
get someConfigValue():number {
return 1;
}
}
@Injectable()
class MyConfig2 extends ConfigBase {
get someConfigValue():number {
return 2;
}
}
let config = new MyConfig1();
let serverUrl = 'http://example.com';
@NgModule({
providers: [
{provide: 'serverUrl', useValue: 'http://},
{provide: ConfigBase, useValue: config}
],
...
})
@Injectable()
class MyService {
constructor(
private http:Http,
@Inject('serverUrl') private serverUrl:string,
private config:ConfigBase
) {}
doSomething() {
console.log(this.config.someConfigValue);
this.http.get(this.serverUrl).subscribe(...);
}
}