2017-01-02 39 views
21

我想將服務注入到不是組件的類中。如何將服務注入類(不是組件)

例如

MYSERVICE

import {Injectable} from '@angular/core'; 
@Injectable() 
export class myService{ 
    dosomething(){ 
    //implementation 
    } 
} 

MyClass的

import { myService } from './myService' 
export class MyClass{ 
    constructor(private myservice:myService){ 

    } 
    test(){ 
    this.myservice.dosomething(); 
    } 
} 

此解決方案不起作用(我想是因爲MyClass的尚未實例化)。

是否有另一種使用服務的方法(不是組件)?或者如何設計代碼(在類中使用服務而不是組件)

謝謝。

回答

16

注入僅適用於由Angulars依賴注入(DI)實例化的類。

  1. 您需要
    • 添加@Injectable()MyClass
    • 提供MyClass像部件或NgModule providers: [MyClass]

當你再注入MyClass某處,一個MyService實例被傳遞給MyClass當它被實例化的DI(它被注入在第一時間之前)。

  • 一種替代的方法是像
  • constructor(private injector:Injector) { 
        let resolvedProviders = ReflectiveInjector.resolve([MyClass]); 
        let childInjector = ReflectiveInjector.fromResolvedProviders(resolvedProviders, this.injector); 
    
        let myClass : MyClass = childInjector.get(MyClass); 
    } 
    

    這樣myClass配置定製注射器將是一個MyClass例如,通過Angulars DI實例化,並myService在實例化時將被注入MyClass
    又見Getting dependency from Injector manually inside a directive

  • 另一種方式是自己創建實例:
  • constructor(ms:myService) 
    let myClass = new MyClass(ms); 
    
    +0

    我認爲注入服務到獨立的類是一種反模式。 – tomexx

    +1

    當然,但有時候它仍然有意義,並且總是知道什麼是可能的 –

    +0

    爲什麼在構造函數中創建一個新的注入器?爲什麼不使用注入的那個?如果你要創建一個新的,那麼沒有理由首先注入一個 – smac89

    4

    沒有直接回答這個問題,但如果你'閱讀這個SO的原因,我這可能會有所幫助...

    假設你正在使用ng2-translate,你真的想讓你的User.ts類有它。你直接的想法是使用DI來放置它,畢竟你在做Angular。但是這有點過分了,你可以將它傳遞給你的構造函數,或者將它設置爲你從組件中設置的公共變量(大概是在DI中設置的)。

    例如:

    import { TranslateService } from "ng2-translate"; 
    
    export class User { 
        public translateService: TranslateService; // will set from components. 
    
        // a bunch of awesome User methods 
    } 
    
    從注入TranslateService

    addEmptyUser() { 
        let emptyUser = new User("", ""); 
        emptyUser.translateService = this.translateService; 
        this.users.push(emptyUser); 
    } 
    

    一些與用戶相關的組件

    則希望這有助於那些有像我誰是約寫了很多的困難,因爲我們太維護的代碼(注意:你可能想要設置一個變量,而不是使其成爲你的構造函數方法的一部分的原因是你可能會遇到不需要使用該服務的情況,所以總是需要通過它將意味着introducin g額外的進口/代碼,從來沒有真正使用)

    +0

    我喜歡這個解決方案 – MFAL