@exodus/dependency-injection

中文文档
3.3.1发布于 2026/10/14MITTypeScriptES Module近 30 天下载 1.3万

集装箱的简单依赖性注射和倒置

中文使用文档
文档目录8 节
  1. 使用量
  2. 压倒性的依赖关系
  3. 可选依赖关系
  4. 注入样式
  5. 已知问题/局限性
  6. 示例(无标题)
  7. 理由
  8. 杂项( 仅实现过度)

@ exodus/ 依赖注射

这是控制容器的基本倒置,它解决了依赖性图表,将所有节点都即时化. 如果你想用它,如果你正在缝合 一个应用程序 从几十个不同的模块, 和你的强制定义 依赖DAG 开始变得无法管理.

有很多复杂的反转 控制容器在那里,例如. 无效, (中文(简体) ), 阿维利克斯还有其他 他们可能很棒。 有一天,我们可能会转向它们, 但此时,它们已经过度杀伤, 它们提高认知负载 比绝对必要的。 这个库以高度有见地的方式执行一个简单的容器,几乎没有灵活性. 以下是依赖列表中的样本节点:

[
  ...,
  {
    id: 'harry',
    dependencies: ['scar', 'dobby'],
    factory: ({ scar, dobby }) => {
      // Harry uses his scar to defeat dobby, or however that book goes
    },
    type: 'wizard', // optional
  }
]

如所见:

  • 每个节点都有全球独有的字符串 id。 。 。 .
  • 它列出其 dependencies 作为字符串标识.
  • 它宣布 factory 函数,它接收单个对象作为参数,命名选项映射 1:1 到 ids 在依赖性中列出
  • 它宣布一个可选 type 字段。 您可以用它查询节点的容器 type 是一个特定值.

容器会给出一个这样的节点列表,会给出所有实例. 就是这样!

使用量

宣布节点和边缘 让集装箱把一切都接通.

import createContainer from '@exodus/dependency-injection'

const createLogger =
  (namespace) =>
  (...args) =>
    console(namespace, ...args)

const container = createContainer({ logger })

container.registerMultiple([
  {
    id: 'storage',
    factory: createStorage,
  },
  {
    id: 'assetsModule',
    // the container will pass `({ logger })` to the factory
    factory: createAssetsModule,
    dependencies: ['logger'],
  },
  {
    id: 'walletAccountsAtom',
    factory: () =>
      createInMemoryAtom({
        defaultValue: { [WalletAccount.DEFAULT_NAME]: WalletAccount.DEFAULT },
      }),
  },
  {
    id: 'enabledWalletAccountsAtom',
    // the container will pass `({ walletAccountsAtom })` to the factory
    factory: createEnabledWalletAccountsAtom,
    dependencies: ['walletAccountsAtom'],
  },
  {
    id: 'blockchainMetadata',
    factory: createBlockchainMetadata,
    // the container will pass `({ assetsModule, enabledWalletAccountsAtom })` to the factory
    dependencies: ['assetsModule', 'enabledWalletAccountsAtom'],
  },
])

压倒性的依赖关系

容器在遇到重复的依赖标识时会抛出. 为测试目的, 使用覆盖旗

container.register({
  id: 'balances',
  override: true,
  factory: () => ({ load: jest.fn() }),
})

container.resolve()

const {
  storage,
  assetsModule,
  walletAccountsAtom,
  enabledWalletAccountsAtom,
  blockchainMetadata,
  balances,
} = container.getAll()

可选依赖关系

可选的依赖关系可以通过附加后缀来请求 ?数字 :

container.register({
  id: 'jediSurvivor',
  factory: ({ lightsaber, theForce }) => {
    if (lightsaber) {
      // code has to make sure optionality is gracefully handled
      return new InsaneLightsaberWiedlingJedi(lightsaber)
    }

    return new ThereIsOnlyTheForce(theForce)
  },
  dependencies: ['lightsaber?', 'theForce'],
})

注入样式

默认的依赖性作为命名选项被注入,这就是推荐的模式. 但是,如果您的使用大小写需要将依赖性作为位置参数注入,例如,如果您的工厂功能是 reselect 选择器,指定 injectDependenciesAsPositionalArguments: true 在容器一级通过建造器,或在单个节点一级。 见 实例 在测试.

已知问题/局限性

  • 每个节点中只有一个被创建. 在99%的情况下,这是你想要的,但看到 杂项 以实例为例.
  • 这种执行将若干概念概括为一个概念 id数字 :
    • 全球独有的软件包 ID, 由给定软件包导出, 例如 . 'analytics' 联 合 国 分析 模块.
    • 全球独特性 接口 标识符,例如. 'analytics',它与具有某些方法并带有某些签名的物体相对应。 分析师们宣布 dependencies 数组编号.
    • 构建器选项名称,用于分析学的消费者,例如:. constructor({ analytics })

将来我们可能会把这些分开, 但在短期内,我们选择了简单.

示例(无标题)

见 无头 作为真实世界的e2e实例,初始化了国际奥委会,并利用了 多个预处理器.

理由

请允许我模拟一下你的内部对话.

You见鬼! 后生是 1) 更多的动词, 2) 具有更高的认知负载 和 3) 通过使用ID而不是函数指针来打破Intellisense. Container- 我听见了 我应改进这些帮我帮你) (中文(简体) ). 另一方面,我有几个优势随着您节点列表的增长而增长(例如Exodus浏览器扩展已经拥有了>100个节点). 我让你:

  • 明确定义你的依赖关系.
  • 停止手动管理即时命令 。 我会通过走 依赖图来解决问题.
  • 统一即时模式和最佳做法.
  • 验证一个节点是否接收所有已申报的依赖.
  • 集中记录,出错处理,权限等内容. 这让你把密码弄干.
  • 通过依赖树进行跟踪事件/数据传播.
  • 可视化/打印/绘制依赖图.
  • 自动插入 namespaced loggers, namespaced 存储实例, 以及节点特定配置 .

杂项( 仅实现过度)

检查出来 @ exodus/ 依赖性预处理器,使 config 财务报告和审定财务报表 logger 以上叙述的特殊情况.

版本与发布记录

@exodus/dependency-injection 共发布 23 个版本,首次发布于 2022/11/22;过去 12 个月发布了 2 个版本。

版本发布日期距今
3.3.1latest2026/10/141 个月前
3.3.02026/04/286 个月前
3.2.12025/08/131.3 年前
3.2.02025/01/241.8 年前
3.1.12024/11/022 年前
3.1.02024/09/262 年前

关于 @exodus/dependency-injection 的常见问题

@exodus/dependency-injection 是什么?

集装箱的简单依赖性注射和倒置

如何安装 @exodus/dependency-injection?

在项目目录运行 npm install @exodus/dependency-injection,或使用 pnpm add / yarn add / bun add。

@exodus/dependency-injection 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@exodus/dependency-injection 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@exodus/dependency-injection 可以商用吗?

@exodus/dependency-injection 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@exodus/dependency-injection 的下载量有多少?

根据 npm 官方下载统计,@exodus/dependency-injection 在 2026/10/14 – 2026/11/12 这 30 天内被下载 12,533 次,日均约 418 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@exodus/dependency-injection 还在维护吗?

最新版本 3.3.1 发布于 2026/10/14(1 个月前);至今共发布 23 个版本,其中过去 12 个月发布了 2 个;首次发布于 2022/11/22。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。