簡體   English   中英

Angular:服務注入與打字稿靜態方法

[英]Angular : Service Injection vs Typescript Static Methods

這可能是一個初學者的問題,問題與理解為什么我們需要將服務注入組件有關。

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

而且我不需要注入它或寫下額外的必要工作。

我知道服務注入是已知的良好實踐,但我真的不明白為什么。 感謝有人會向我解釋更多。

依賴注入提供了更大的靈活性,使您的應用程序部件更加獨立。 我個人被靜態方法燒毀的一個案例 - 我開發了一個庫,一些由多個子項目組成的項目使用了我的lib的不同次要版本。 這些之間沒有重大變化,依賴注入也可以正常工作,注入Angular選擇的第一個注入,但靜態方法是在特定類上定義的,所以最終得到2個不同版本的2種不同方法。

依賴注入的一個非常有用的功能是令牌 - 您可以為不同的地方提供不同的東西,以滿足特定的需求,但都遵循特定的界面。 示例是使用ControlValueAccessor的自定義控件或組合多個組件的抽象 - 如果要創建可以與多個組件一起使用的指令,可以通過在其中注入令牌並在您的所有合適組件中提供該令牌來實現。

總的來說,依賴注入有很多簡潔的功能,而普通的靜態方法是不可能的,而靜態方法也有缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM