cellbang / cell

Cell is a Serverless First, componentized, platform-independent progressive application framework based on TypeScript. Cell 是基于 TypeScript 的 Serverless First、组件化、平台无关的渐进式应用框架。
https://malagu.naily.cc
MIT License
705 stars 62 forks source link

feat(core): ContainerUtil添加两个工具函数:`getContainerDictionary`和`getContainerDictionaryMap` #216

Closed Groupguanfang closed 1 week ago

Groupguanfang commented 1 month ago

添加这两个函数的意图

inversify内部似乎没有明面上提供任何可以遍历某个容器类内所有元素的方法,这导致很难去做一些全局的操作,每一个扩展的库都得实现一个Map、至少一个以上的装饰器来遍历所有被装饰器标记过的类,局限性很大。

但是我们可以避开TypeScript编译器,通过container['_bindingDictionary']拿到这个隐藏在Container上的Dictionary;通过dictionary['_map']拿到该Dictionary上的Map(即实际上的inversify存放元素的容器)。

添加了这两个工具函数,我们就可以拿到所有的类,对这些收集到的类做一些其他事情了:

// module.ts
import './user-controller';
import './home-controller';
import { autoBind, ContainerUtil, ContainerProvider } from '@celljs/core';

export default autoBind();

ContainerProvider.asyncProvide().then(container => {
    const map = ContainerUtil.getContainerDictionaryMap(container);

    for (const [key, value] of map) {
        console.log(value) // 遍历打印出所有被注入的类
    }
})

一些顾虑

加上这两个函数有利也有弊。是否真的要把这两个函数加上去?

反正综上,既有好处也有坏处,请项目的creator三思而后合并。

muxiangqiu commented 1 week ago

我判断没有必要,因为不建议通过 _map 去取内部变量,这种行为是很危险的。所以官方不应该提供这样的方法。

如果用户想获取所有的注入的对象可以使用 ContainerProvider.provide() 获取 container 对象,然后自己使用 _map 去获取就好了