angular - tree-shakable 服务如何避免循环依赖,而 pre-Angular 6 DI 没有?
问题描述
首先,我创建一个要传入的函数useFactory
:
// circular.factory.ts
export let circularFactory = (instance: MyService) => {
console.log('calling useFactory with:', instance);
return instance || new MyService()
}
现在我要配置 DI,使服务引用工厂,工厂引用服务。
第一个场景:
在这里,我使用了 pre-angular 6 DI 方式providers
在NgModule
我的AppModule
.
// app.module.ts
@NgModule({
imports: [BrowserModule],
declarations: [AppComponent],
bootstrap: [AppComponent],
providers: [{
deps: [
[MyService]
],
provide: MyService,
useFactory: circularFactory
}]
})
export class AppModule {}
运行将导致以下错误:
错误:提供程序解析错误:无法实例化循环依赖!MyService ("[ERROR ->]"): 在 NgModule AppModule 中的 ./AppModule@-1:-1
嗯,这是可以预料的。事实上,我创建了一个循环依赖。
第二种情况:
这次我将使用@Injectable()
providedIn
属性来配置 DI 以引用根。
// my.service.ts
@Injectable({
deps: [
[MyService]
],
providedIn: 'root',
useFactory: circularFactory
})
export class MyService {
constructor() {
console.log('instantiating MyService')
}
}
...
// app.component.ts
@Component({
selector: 'app-component',
template: `
<h1>Oh, hi, there.</h1>
`
})
export class AppComponent {
constructor(public myService: MyService) {
console.log('injecting dependency into AppComponent:', this.myService);
}
}
如您所见,我添加了一些控制台日志用于调试目的。结果如下:
calling useFactory with: undefined
instantiating MyService
injecting dependency into AppComponent:
与第一种情况相反,它以某种方式设法将令牌解析为useFactory
into undefined
。但是怎么来的?它不应该像第一个示例那样因循环依赖错误而失败吗?它不应该以同样的方式工作吗?我无法得到它。
这是您可以运行的闪电战。
解决方案
推荐阅读
- php - 如果值在 mysqli 数据库上,则不要在 php 上创建按钮
- c# - 计划的日常工作(使用简单的每日计划)与 QUARTZ 没有按预期触发?
- javascript - Javascript:知道调用了哪个对象函数
- excel - 为什么excel中的TEXTJOIN函数不能正常工作?
- ruby-on-rails - ActiveRecord 无法识别belongs_to 关联
- angular - 如何在量角器中忽略 websocket(在网络选项卡中找到)?
- c++ - 如何使用 Mako SDK 在 PDF 中模拟叠印?
- html - Bootstrap Navbar 和 Carousel 没有响应
- nginx - 本地ip或域名的AB负载测试?
- java - 透明活动内容与父不匹配