这个 resolver 只针对 Proxy Facade,根据 feature 名称和 FacadeClass,获取对应的 resolver. 该 resolver 知道怎样将函数调用,投递到该 facade 的具体实现类去。
![](https://img.haomeiwen.com/i2085791/e5c613fae399906c.png)
![](https://img.haomeiwen.com/i2085791/3f4a8fa0e038fd21.png)
featureName:cartQuickOrderCore
![](https://img.haomeiwen.com/i2085791/9db6f52a503f6f6d.png)
最后得到实际值:cartQuickOrder
![](https://img.haomeiwen.com/i2085791/963aabccf187424e.png)
返回 resolver 的逻辑放在一个 defer 函数块里了:
![](https://img.haomeiwen.com/i2085791/4054d3bb6c62a687.png)
当应用程序开始调用 facade 的方法时,被投递到代理类:
![](https://img.haomeiwen.com/i2085791/326dc44ad2e3bd7e.png)
此时 resolver$ 包含的一大段在 defer 里的逻辑始终未得到执行。
![](https://img.haomeiwen.com/i2085791/edb340a6ca8b0e92.png)
所以,从语义上说,resolver 解析出来的对象,就是该 facade 真实的实现类?这个 connect 应该相当于 subscribe 方法。
![](https://img.haomeiwen.com/i2085791/0806ad98624d0ca5.png)
果然,connect 方法会触发 defer 块内的函数调用:
![](https://img.haomeiwen.com/i2085791/4f638f5cbbbbc979.png)
![](https://img.haomeiwen.com/i2085791/da2e1ceefb946de6.png)
触发 core module 延迟加载:
![](https://img.haomeiwen.com/i2085791/ce7458e1e9ea67fe.png)
加载完 QuickOrderModule 之后,从 ModuleRef 里拿到 injector,再调用这个 module 的 injector,拿到 facadeClass 对应的实现类:
![](https://img.haomeiwen.com/i2085791/c86be20932349224.png)
大功告成,拿到实现类 QuickOrderService 了:
![](https://img.haomeiwen.com/i2085791/a4613b809a48a9b0.png)
此时就可以调用该实现类的方法了:
![](https://img.haomeiwen.com/i2085791/63a57494e075811b.png)
总结
Resolver 负责触发 Proxy Facade 对应的具体实现类的延迟加载,加载完成后,从 Module Ref 里拿到 injector,再使用 injector 拿到 Proxy Facade 的具体实现类的实例。
更多Jerry的原创文章,尽在:"汪子熙":
![](https://img.haomeiwen.com/i2085791/97c4752c0e619c44.png)
网友评论