【问题标题】:Inject service into class (not component) Angular2将服务注入类(不是组件)Angular2
【发布时间】:2017-08-11 01:06:58
【问题描述】:

我正在努力寻找一种将服务注入 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,因为我只是想引用在应用程序级别实例化的单例)。

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

谢谢

【问题讨论】:

    标签: class angular service dependency-injection


    【解决方案1】:

    没有办法将服务注入普通类。 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

    【讨论】:

    • 感谢您的快速回复!是的,对我来说似乎最简单的事情就是在创建类时将引用推送到构造函数。
    【解决方案2】:

    我正在为一个类似的问题而苦苦挣扎,而我最终做的是使服务成为单例以及 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;
      }
    }

    【讨论】:

    • 我投了赞成票,因为这在我希望为整个应用程序提供单个服务实例的情况下效果很好。但是,如果我在应用的不同部分需要不同的服务实例怎么办?
    • 如果您的服务依赖于其他组件/服务/模块/等并且需要在构造函数中注入它们,这将无济于事。
    • 这是我想出的解决方案,只是我没有更新服务。我抛出了父母没有注入服务的异常。这解决了 Denis 观察到的问题,并且依赖项对服务不可用。
    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2017-06-27
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    相关资源
    最近更新 更多