背景
我们正在构建一个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时,这种技术更有用.无论如何,这是相当罕见的,但可以是一个有用的解决方法.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。