Angular : Service Injection vs Typescript Static Methods

标签 angular typescript

这可能是一个初学者问题,这个问题与理解为什么我们需要将服务注入(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/

相关文章:

http - 从 Postman 调用 Twitter API 是可行的,但从 Angular 2 应用程序调用它就不行了

angular - 在 Angular 中,这是在尝试关闭之前检查可观察订阅是否打开的有效方法吗?

reactjs - 在 Next.js 上使用 jest 找不到模块错误

javascript - Angular 中选择框的默认值 "placeholder"?

javascript - 构建开发失败 : Cannot set property 'fileSystem' of null

angular - 错误处理程序 : Not able to get the error object when used with promise

html - 访问过滤结果 Angular 6

javascript - 在父组件相同的两个组件之间发送数据

typescript - Angular2 QuickStart 拒绝为发布候选构建

javascript - 如何在 Angularjs2 中使用 jquery 设置输入值并更新模型值?