Angular:服务注入 vs TypeScript 静态方法

22

这可能是初学者的问题,与了解为什么需要将服务注入组件有关。

1] 为什么我们需要将服务注入到每个组件中,而不是只创建静态方法并返回相同的输出,我们真的不需要为注入这些服务编写额外的代码吗?

假设我有一个像下面这样的认证服务:

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;
    }
}

在视图模型中,我会像这样使用它:

首先:注入服务

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); }
    );
}

但是如果我一开始就将身份验证服务中的认证方法设置为静态的,那么我只需要执行以下操作:

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); }
    );
}

我不需要注入或编写额外的必要工作。

我知道服务注入是一个已知的好习惯,但我真的不明白为什么。如果有人能更详细地解释一下,我会非常感激。


4
如果你在意可测试性和解耦,永远不要使用静态方法。Angular基于依赖注入(DI)构建了其架构,使得按照这些原则编写代码变得轻而易举。 - Günter Zöchbauer
1
官方Angular文档中关于DI的章节还有一段很长的介绍,解释了“为什么要使用DI”: https://angular.io/guide/dependency-injection#why-dependency-injection - JB Nizet
可能是Typescript和AngularJS-静态方法与服务的区别的重复问题。 - Sylvain
1个回答

7

依赖注入提供了更多的灵活性,使您的应用程序部件更加独立。我个人遇到过一种情况,在开发一个库时,由多个子项目构成的某些项目使用了我的库的不同小版本。这些版本之间没有重大变化,使用依赖注入就可以很好地工作,注入Angular选择的第一个可注入对象,但是静态方法定义在特定类上,因此您最终会得到来自两个不同版本的2种不同方法。

依赖注入非常有用的一个功能是令牌——您可以为不同的地方提供不同的东西,以适应特定的需求,但所有东西都遵循特定的接口。例如使用ControlValueAccessor自定义控件或组合多个组件的抽象——如果您想创建一个指令,可以在其中注入一个令牌,并在您的所有适当组件中提供该令牌。

总的来说,依赖注入具有许多有用的功能,这些功能仅通过普通的静态方法无法实现,并且静态方法具有缺点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接