加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angular – 确保实例化服务

发布时间:2020-12-17 07:01:45 所属栏目:安全 来源:网络整理
导读:背景 我们正在构建一个Angular2应用程序,并且正在积累与一个模块相关的许多特定服务.所有这些服务都松散地耦合到主题类型应用中的事件系统. 通过构造函数实例化 因为这些服务永远不会被直接引用,只能订阅事件,所以我们只需要以某种方式实例化它们.目前我们只
背景

我们正在构建一个Angular2应用程序,并且正在积累与一个模块相关的许多特定服务.所有这些服务都松散地耦合到主题<类型>应用中的事件系统.

通过构造函数实例化

因为这些服务永远不会被直接引用,只能订阅事件,所以我们只需要以某种方式实例化它们.目前我们只是将它们注入到另一个使用的服务的构造函数中.

// Services not used,just to make sure they're instantiated
constructor(
  private appService1: AppService1,private appService2: AppService2,private appService3: AppService3,...
){ }

这看起来有点像黑客,是否有更好的方法来显式声明需要实例化的服务而不通过构造函数注入它们?

解决方法

正如各种评论中所提到的,一个选项就是直接实例化这样的服务,这看起来就像

// app.module.ts

@NgModule({
  providers: [
    { provide: AppService1,useValue: new AppService1() },{ provide: AppService2,useValue: new AppService2() },useValue: new AppService3() }
  ]
}) export class AppModule {}

您可能想要避免直接实例化,因为它违反了所有内容都由Injector思维模式处理,但它不会因为多种原因而破坏DI或可测试性.

一个原因是ES模块的使用,结合使用可配置的加载器,以及TypeScript结构类型性质的表现力,甚至可以通过利用像SystemJS这样的加载器在运行时将这些类型的依赖项交换为测试双精度.

也就是说,如果你发现自己经常这样做,你可能需要重新评估你的应用程序结构,但总的来说有很多用例,这个解决方案是最简单的.
此外,它可以打破喷射器中的循环.

通过注入器中的中断循环,我的意思是可以通过简单地在为useValue指定的表达式中引用其值来捕获需要在另一个服务的构造函数中注入的所需服务的实例.使用useFactory时,这种技术更有用.无论如何,这是相当罕见的,但可以是一个有用的解决方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读