2017-09-29 13 views
1

使用Angular4我已經爲不同的數據庫創建了服務。每個數據庫的動作都是一樣的(有點像CRUD),但有不同的API端點(但功能完全一樣)。以編程方式將類型傳遞給服務的最佳方式是什麼?

我正在爲每個數據庫創建一個服務,但我想一定有更好的方法來管理這個。

有沒有辦法在導入過程中或組件中傳遞「名稱」給服務,以便服務知道應該點擊哪個端點?

實施例:

import {ApiService} from '../_services/api.service.ts'; 

和在該服務:

let endpoint = enter code here defined from import of component 
private url = '/api/' + endpoint 
+0

當然,但這不是一個好主意。你讓你的代碼變得脆弱而難以閱讀以節省幾行 – bryan60

+0

你可以擴展它如何變得脆弱嗎?有6 150個線路服務或1個服務延長6次更好嗎? – kisonay

+0

6 150線服務。爲了實現這一目標,你需要強制每個消費者遵守這種單一的服務風格,這將是一個固有的容易出錯的過程,此外,潛在的單一服務的變化可能會破壞整個應用程序並促成重大重組,這就是它的意思變脆。角度風格指南建議乾燥,但不要太乾。這太乾了。 Angular公開已經封裝了主要CRUD操作的http客戶端。沒有理由讓它變得更通用。 – bryan60

回答

1

喜歡的東西

@Injectable() 
abstract class ApiService { 
    protected endpoint; 

    protected get url() { 
    return '/api/' + this.endpoint; 
    } 

    constructor(protected http: Http) {} 

    getItems() { 
    return this.http(this.url); 
    } 
} 

class SomeService extends ApiService { 
    protected endpoint = 'some'; 
} 

注意endpoint被定義爲一個場和url爲只讀存取,這允許在子類中保持適當的順序。

較溼的版本(也可以讓子類來注入額外的依賴)是:

@Injectable() 
abstract class ApiService { 
    constructor(protected http: Http) {} 
    ...  
} 

@Injectable() 
class SomeService extends ApiService { 
    constructor(http: Http /*, protected some: Some */) { 
    super(http); 
    } 
    ... 
} 

如果相同的依賴在父級和子類仍然存在,它應該有隻在父類protected訪問修飾符。

+0

接受這個答案,但在問題評論中@ bryan60指出,這可能會在將來的api修訂中出現問題,在創建應用程序時應該考慮這些修訂。 – kisonay

+1

如果它永遠成爲一個問題,那麼使用OOP概念來生成DRYer代碼並不是錯誤的使用它們。如果服務幾乎完全相同,這是一回事。如果你想讓弗蘭肯斯坦的父母班級取悅所有可能的孩子,那是另一回事。我個人認爲這種方法完全沒有問題。這些類可以隨時重構以適應案例。 – estus

+0

謝謝@estus,是的服務是相同的,只是不同的終點。我在注入後導出類,但Angular拋出「錯誤:無法解析所有參數爲SomeService」任何想法爲什麼? – kisonay

相關問題