这可能是一个初学者问题,这个问题与理解为什么我们需要将服务注入(inject)组件有关。
1] 为什么我们需要将服务注入(inject)每个组件,而我们可以只创建一个静态方法并且它会返回相同的输出,而且我们真的不需要继续编写额外的注入(inject)代码这些服务?
假设我有一个像下面这样的具有正常约定的身份验证服务:
import { Injectable } from '@angular/core';
import { Http, Response, Headers } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import { GlobalConfig } from "../global-config";
// Models
import { UserModel } from "../models/user-model";
@Injectable()
export class AuthenticationService {
constructor(private http: Http) { }
authenticate(user: UserModel): Observable<UserModel> {
let userObject = this.http.post(GlobalConfig.getUrlFor('authentication'), user)
.map((response: Response) => {
let responseJSON = response.json();
let userObj = <UserModel>{
UserId: responseJSON.UserId,
FirstName: responseJSON.FirstName,
LastName: responseJSON.LastName,
FullName: responseJSON.FullName,
Email: responseJSON.Email,
UserName: responseJSON.UserName,
Password: responseJSON.Password
};
return userObj;
});
return userObject;
}
}
在 View 模型中,我会这样使用它:
首先:注入(inject)服务
constructor(private authService: AuthenticationService) {}
第二:调用它
login() {
this.authService.authenticate(this.user)
.subscribe(
p => {
GlobalConfig.baseUser = p;
localStorage.setItem('user', JSON.stringify(p));
this.router.navigate(['/dashboard']);
},
e => {console.log('Error has Occured:', e); }
);
}
但如果我首先在身份验证服务中将身份验证方法设置为 Static,我会做的如下:
login() {
AuthenticationService.authenticate(this.user)
.subscribe(
p => {
GlobalConfig.baseUser = p;
localStorage.setItem('user', JSON.stringify(p));
this.router.navigate(['/dashboard']);
},
e => {console.log('Error has Occured:', e); }
);
}
而且我不需要注入(inject)它或编写额外的必要工作。
我知道服务注入(inject)是众所周知的良好做法,但我真的不明白为什么。如果有人愿意向我解释更多,我将不胜感激。
最佳答案
依赖注入(inject)提供了更大的灵 active ,并使您的应用程序部分更加独立。我个人被静态方法烧毁的一个案例——我开发了一个库,一些由多个子项目组成的项目使用了我的库的不同次要版本。它们之间没有重大变化,依赖注入(inject)可以正常工作,注入(inject) Angular 获取的第一个可注入(inject)对象,但是静态方法是在特定类上定义的,因此您最终会得到来自 2 个不同版本的 2 个不同方法。
依赖注入(inject)的一个非常有用的特性是 token ——你可以为不同的地方提供不同的东西以满足特定的需求,但都遵循特定的接口(interface)。示例是使用 ControlValueAccessor 的自定义控件或组合多个组件的抽象 — 如果您想创建一个可以与多个组件一起使用的指令,您可以通过在其中注入(inject)一个 token 并在您的所有合适组件中提供该 token 来实现。
总的来说,依赖注入(inject)中有很多简洁的特性是普通静态方法无法实现的,而且静态方法也有缺点。
关于 Angular : Service Injection vs Typescript Static Methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46142449/