将服务注入类(不是组件)Angular2

时间:2017-03-19 20:40:08

标签: class angular service dependency-injection

我正在努力寻找一种方法将服务注入到angular2中的类对象中。

*注意:这不是一个组件,只是一个类。 *

export class Product {

  id: number;
  name: string;
  manufacturer: string;

  constructor(product: any) {

    this.id = product.id;
    this.name = product.name;
    this.manufacturer = product.manufacturer;

}

我提出的唯一解决方案是每当我创建新产品时都将服务引用传递给构造函数...即:而不是new Product(product)我会new Product(product, productService)。这似乎很乏味且容易出错。我宁愿从类中导入引用而不是弄乱构造函数。

我尝试过ReflectiveInjector:

let injector = ReflectiveInjector.resolveAndCreate([ProductService]);
this.productService = injector.get(ProductService);

然而,这会产生错误No provider for Http! (ProductService -> Http) at NoProviderError.BaseError [as constructor](另外,我非常确定当我想要引用在应用级别实例化的单例时,这会创建一个新的productService。)

如果有人知道有效的解决方案,我会很高兴听到它。现在我将通过构造函数传递引用。

由于

2 个答案:

答案 0 :(得分:4)

无法将服务注入普通类。 Angular DI只注入组件,指令,服务和管道 - 只有DI创建实例的类,因为这是注入发生的时候。

要从自定义注入器获取Http,您需要添加Inject Http manually in angular 2

中显示的提供商

或者您传递提供它们的父注入器

// constructor of a class instantiated by Angulars DI
constructor(parentInjector:Injector){
  let injector = ReflectiveInjector.resolveAndCreate([ProductService]);
  this.productService = injector.get(ProductService, parentInjector);
}

另见https://angular.io/docs/ts/latest/api/core/index/ReflectiveInjector-class.html

答案 1 :(得分:4)

我正在努力解决类似的问题,而我最终做的就是让服务成为单身人士以及Angular注射剂。

这样你可以通过DI注入Angular类并调用静态getInstance()方法来获取类的单例实例。

这样的事情:

import {Injectable} from "@angular/core";
@Injectable()
export class MyService {

  static instance: MyService;

  static getInstance() {
    if (MyService.instance) {
      return MyService.instance;
    }

    MyService.instance = new MyService();
    return MyService.instance;
  }

  constructor() {
    if (!MyService.instance) {
      MyService.instance = this;
    }
    return MyService.instance;
  }
}