2016-08-23 81 views
7

我目前挖掘到DI在角2.我使用的是通用的亞型混凝土的數據類型是這樣實現REST客戶端外:角2進樣依賴構造

class RESTClient<T>{ 
    constructor() { 
     var inj = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]); 
     this.http = inj.get(Http); 
     this.conf = RESTConfiguration; 
    } 
} 
class BookClient extends RESTClient<Book>{  
    constructor(){ 
     // since I dont want to inject the HTTP Providers here, I'm using a custom injector in the super class 
     super(); 
    } 
} 

class WriterClient extends RESTClient<Writer>{  
    ... 
    ... 
} 

所以,按照我的理解,有將是由超類REST服務注入的所有RESTClient之間共享的一個http服務。

現在我想有一個RESTConfiguration類這樣:

@Injectable() 
export class RESTConfiguration { 
    get baseURL() { 
    return this._baseURL; 
    } 

    set baseURL(value) { 
     alert("sets value to"+value); 
     this._baseURL = value; 
    } 

    private _baseURL; 

} 

應該在主應用程序被配置爲這樣:

initializeApp(){ 
    this.restconf.baseURL = "http://localhost:3004/"; 
} 
bootstrap(MyApp, [RESTConfiguration]).then(); 

我現在想知道如何注入一個單我的RESTConfiguration實例放入RESTService類中,而不將它傳遞給我想保持無參數的構造函數,以減少代碼重複並避免使用typescript中泛型的問題。

在上面的例子中(第一個代碼片段)我試圖使用我創建的ReflectiveInjector注入我的配置,它爲我提供了一個自定義配置實例。

我想到了幾個解決方案:

  1. 獲取訪問應用程序「全球噴油器」使用服務或一些靜態類屬性

  2. 實施額外的單邏輯爲使一個可用的我配置

  3. 尋找在構造函數外部使用角度本地注入方法的方法?

在我的思維中是否存在錯誤或者我濫用了DI框架?

+0

看起來像一個dup http://stackoverflow.com/questions/39038791/inheritance-and-dependency-injection/39038814?noredirect = 1#comment65548939_39038814 –

+0

在閱讀上面的鏈接問題之後,我非常感受作者 - 我傾向於使用他的「髒黑客」來通過全局注入器 - 我絕對不想在〜 20-30課。任何方式來解決這個問題?如何使用自定義注入器如上所示?然後,我可以直接將配置附加到我的服務中,或者只是將其設置爲一個簡單的靜態類... – hakkurishian

+0

這會創建一個獨立的注入器。此自定義注入器不會返回任何模塊中註冊的提供者以及爲這些提供者創建的實例。您可以按照鏈接問題的答案來做 - 將您的Angular2應用程序的注入器傳遞給周圍,並從該注入器獲取服務。 –

回答

7

這應該爲這個問題提供解決方案,但也有助於在任何情況下需要注入服務而不提供它作爲構造參數。

我看到這個答案在另一篇文章: Storing injector instance for use in components

你可以配置你的AppModule類的角度噴油器,然後在其他類中使用它(你可以從任何類訪問的AppModule的成員)。

在的AppModule補充:

export class AppModule { 
    /** 
    * Allows for retrieving singletons using `AppModule.injector.get(MyService)` 
    * This is good to prevent injecting the service as constructor parameter. 
    */ 
    static injector: Injector; 
    constructor(injector: Injector) { 
     AppModule.injector = injector; 
    } 
} 

然後在您的其他類,你可以做以下的(對於這個問題,替換以http爲MyService):

@Injectable() 
export class MyClass{ 
    private myService; 

    constructor(){ 
     this.myService = AppModule.injector.get(MyService); 
    } 
} 

這將是等效採用:

constructor(private myService: MyService){} 
+0

它的作品! 在我的情況:從另一個模塊獲取服務(不是懶惰),所有解決實例! 謝謝你。 – 1antares1