Angular 2构造函数注入vs直接访问

时间:2017-03-04 19:33:59

标签: angular service dependency-injection

Q1。我有一个通用的实用程序类,带有一些实用程序/辅助方法(没有get / post请求)。我要问的第一件事是它应该是一个简单的类还是一个@Injectable类。因为两者都可以在导入任何组件类之后使用,如此

import { Injectable } from '@angular/core';

Injectable()
export class Utils {
}

OR

export class Utils {
}

Q2。如果它是可注入的,那么我必须在我的组件类中导入它,在构造函数中注入,并且必须添加在providers数组中然后我可以使用注入类/服务的任何方法,如

import { Utils } from './../shared/utils';

@Component({
    moduleId: module.id,
    selector: 'abc',
    templateUrl: './abc.component.html',
    providers: [Utils]
})

export class DemoComponent implements OnInit {

    constructor(private _u: Utils) { }

    ngOnInit(): void {
        this._u.someMethod();
    }
}

但除此之外,我可以直接访问服务方法而无需构造函数注入,而无需添加提供程序,这是一种简短的方法,如

import { Utils } from './../shared/utils';

@Component({
    moduleId: module.id,
    selector: 'abc',
    templateUrl: './abc.component.html'
})

export class DemoComponent implements OnInit {

    constructor() { }

    ngOnInit(): void {
        Utils.someMethod();
    }
}

所以我想知道哪一个更好并且推荐方法?

2 个答案:

答案 0 :(得分:2)

Q1。如果@Injectable()不依赖于任何其他服务,则不需要Utils,但如果确实如此,则必须使用@Injectable()装饰器:

   // 1 case

    @Injectable()  // <--- required
    export class Utils {
       constructor(private _otherService : OtherService){}
    }


    // 2 case
    @Injectable()  // <--- not required
    export class Utils {
      constructor(){}
    }

在这两种情况下,您都必须在组件的providers数组中添加服务。

Q2。使用第一种方法,因为它可以通过传递MockUtils服务来轻松测试您的组件。

答案 1 :(得分:1)

在构造函数中使用它时,

  1. 您在整个组件中使用单独的服务实例。
  2. 当用作Injectable()时,它应该在模块的 providers 数组中声明。

    constructor(private _u: Utils) { }
            ngOnInit(): void {
                    this._u.someMethod();
           }
    
     //private - _u => is specific inside this component
    
  3. 如果是直接访问,资源将按原样使用,可能会产生以下问题

    1. 内存泄漏
    2. 较少的可重用性
    3. 如果是可观察的,在取消订阅之前,您不能再订阅。