2017-09-16 55 views
1

我想知道有什么区别这两个示例:Typescript/Angular 4:注入服务和初始化为新类有什么区别?

export class EditorComponent { 

    constructor(
     public _entryService: EntryService 
){ 
     console.log(this._entryService.entryData.properties); 
    } 

} 

export class EditorComponent { 

    _entryService; 

    constructor(){ 
    this._entryService = new EntryService; 
    console.log(this._entryService.entryData.properties); 
    } 

} 

是两者之间有任何实际的区别吗?

我预计在我对基本理论知识方面可能存在一些差距 - 任何能够帮助我进行自我教育的方向的指针将不胜感谢,谢谢!

+2

'injecting'表示**单个实例**。 'instanctiating'意味着**创建多个实例**。对于'injectable()'服务来说,实例化是一种不好的做法。您可能最终面临[**无法解析所有参数**](https://stackoverflow.com/questions/44996095/angular2-ionic2-cant-resolve-all-parameters-for-gameserviceprovider/44996310#44996310)错误 – Aravind

+0

注入服务并不总是导致一个实例。例如,如果在共享模块的提供者部分内提供服务,则每次将模块导入到另一个模块时都会导致该服务的新实例,除非它是通过'NgModuleWithProviders'定义的,并且通过静态方法([ DOCS](https://angular.io/guide/ngmodule#why-userservice-isnt-shared))。 – cyrix

+1

@cyrix您错误地解释了文档。你描述的行为是指当另一个模块有自己的注入器时,即延迟加载模块的情况。这不会发生,如果一个模块没有延迟加载。 – estus

回答

2

this._entryService = new EntryService等效为组件定义提供商:

@Component({ ..., providers: [EntryService] }) 
export class EditorComponent { 
    constructor(
     public _entryService: EntryService 
){} 
} 

这将创建每个每个组件实例新EntryService实例。

如果没有提供者属于组件喷射器,它将被从母体喷射器(可能是根喷射器)中检索,并且将导致EntryService提供商的单个实例:

@Component({ ..., providers: [] }) 
export class EditorComponent { 
    constructor(
     public _entryService: EntryService 
){} 
} 

的唯一情况时new EntryService可取正时类构造函数接受非DI参数(如this example中所示)。

+0

EntryService不是你的情况下的单例,为了使它成为一个单例,你必须将它作为一个单例实现。 – cyrix

+0

@cyrix它是单个注入器内的单例。如果提供者没有在组件中定义并从定义它的父注入器中检索,则它将是单例。这就是答案所说的。 – estus

+0

这不会使服务类成为单例类,您仍然可以自己创建新的实例,这与单例模式相反。你想说的是,只有一个实例被创建并被模块中的每个组件使用。 – cyrix

相关问题