2017-01-02 38 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