如何在静态 class 的构造函数中创建服务实例 class

How to create instance of service class in constructor of a static class

我有一个参数服务 class 如下所示:

import { Injectable } from '@angular/core';
import { Http, Headers, RequestOptions, RequestMethod } from '@angular/http';
import { Common } from './common';
import { CacheService } from "ionic-cache";

@Injectable()
export class PMService {  

    constructor(public http: Http, public comm: Common, private cache: CacheService) {        

    }
...
}

我在页面中使用此服务 class 通常是这样的:

import { PMService } from '../../providers/pm-service';
@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage { 
    myParameters;

    constructor(private pm: PMService ..) {                                    

    }

    getMyParameter(){
       this.pm.getParameters("ParameterKey").then(result=>{
         this.myParameters= result;
       });
    }
 ...
}

我创建了另一个包含静态方法的 class。我想在这个 class 的构造函数中初始化一个静态 属性。我不能使用 constructor(private pm: PMService) {} 因为静态 属性。我尝试了以下代码,但它需要构造函数参数。做我想做的事的正确方法是什么?

import { PMService } from "./pm-service";

function construct(target: any) {
    target.construct();
}

@construct
export class Manager {

    private static counter: number = 0;
    private static defaultManagerValue: number = 0;

    static construct() {
        var pm = new PMService();
        this.defaultManagerValue = // I want to get this value from PMService;
    }

    public static incrementCounter() {
        this.counter++;
    }

    public isCounterEqualMyParameter(){
        return this.counter == this.defaultManagerValue;
    }
    ...
}   

您不应使用静态 class,而应使用 Singleton。单例是 class 在整个应用程序中只有一个实例,引用 angular 文档:

A singleton service is a service for which only one instance exists in an app.

您可以将静态方法更改为实例方法,并将定义更改为:


@Injectable({
  providedIn: 'root',
})
export class Manager {
  private counter: number = 0;
  private defaultManagerValue: number = 0;

  // ...
}

这样您就可以在构造函数中自由使用 DI,同时具有相同的预期效果。