是否有任何理由(单元测试除外)使用 Angular 2 依赖注入?
Is there any reason(except unit-tests) to use Angular2 Dependancy Injection?
我想弄清楚为什么我们需要 Angular 2 依赖注入。
带有测试的案例很清楚:我们可以轻松地模拟任何服务。
但是你能提供其他原因吗?
使用 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(...);
}
}
我想弄清楚为什么我们需要 Angular 2 依赖注入。 带有测试的案例很清楚:我们可以轻松地模拟任何服务。 但是你能提供其他原因吗?
使用 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(...);
}
}