angular 2 瞬态提供程序而不是单例

Posted

技术标签:

【中文标题】angular 2 瞬态提供程序而不是单例【英文标题】:angular 2 transient providers instead of singleton 【发布时间】:2018-06-26 01:59:45 【问题描述】:

我有提供者,我想充当瞬态而不是单例。我知道我可以手动创建对象,但我仍想通过依赖注入器解决依赖关系。

export class HubServiceBase 

    private readonly hubAuthorizationQueryParameter = 'authToken';

    onCreate = new EventEmitter<any>();
    connectionEstablished = new EventEmitter<Boolean>();
    connectionExists = false;

    private _hubConnection: any;

    constructor(public authManager: AuthenticationProvider)             
    

    initialize(hubSubRoute: string): void
        const accessToken = this.authManager.getRawAccessToken();

        let hubUrl = environment.baseUrl + hubSubRoute;
        if (accessToken) 
            hubUrl += '?' + this.hubAuthorizationQueryParameter +'=' + accessToken;
        

        this._hubConnection = new HubConnectionBuilder()
                                .withUrl(hubUrl)
                                .build();
    
//...

初始化函数可以从不同的服务调用,它与我的服务器维护一个网络套接字。可以有多个打开的套接字同时运行。

如何在每次页面请求时从依赖注入器获取一个新的?

【问题讨论】:

在组件providers属性上配置 @vikas,如何在利用依赖注入器的同时做到这一点? 在阅读问题时,它看起来与您真正想要的不同(根据问题,它不容易理解)! 【参考方案1】:

@Component 装饰器中使用providers 属性。

@Component(
  selector: 'selector-name',
  templateUrl: './template.component.html',
  providers: [ SomeService ]
)

文档(不太好):https://angular.io/api/core/Component

示例:https://stackblitz.com/edit/angular-playground-vewqis?file=app%2Fhello-framework%2Fcomponents%2Fcounter%2Fcounter.component.ts

【讨论】:

谢谢,看起来它会起作用,但我希望文档中有更好的解释 是的,我对文档感到非常失望 - 即使您直接查找它,它也是指令和组件之间的循环引用。 是的,Vikas 提供了一个很好的文档版本,它解释了提供服务链接的范围,但是您首先回答了一个示例,所以我给您标记了支票,如果您愿意的话,请投票给他的答案同样,所以我不会感到内疚;) 听起来很划算;) 谢谢!!我将我的 DataSource 注册为模块上的提供者,并且由于它是作为单例注入的,所以里面的 BehaviourSubject 已完成并且没有重新实例化另一个运行:-)【参考方案2】:

您可以通过以下方式在 Angular 中配置注入器:

    NgModule 上的提供者。

    Components上的提供者

如果您希望全局共享依赖项的实例并在应用程序之间共享状态,您可以在 NgModule.-Singleton

上配置它

如果您希望在组件的每个实例及其子组件之间共享一个单独的依赖项实例,您可以在组件的 providers 属性上配置它。非单例

Providing services Angular's Hierarchical Dependency Injection system

【讨论】:

以上是关于angular 2 瞬态提供程序而不是单例的主要内容,如果未能解决你的问题,请参考以下文章

使用单例数据源的瞬态和作用域服务

在单例服务中使用瞬态服务

依赖注入作用域为瞬态,然后瞬态为单例

您可以在 Angular / NestJS 模块提供程序中使用 `useFactory` 属性并返回一个类而不是实例吗?

Hibernate/JPA 是不是考虑了瞬态修饰符(而不是注释)

无法从 innerHTML 获取动态数据 - Angular