# @exodus/dependency-injection 中文文档

规范地址：https://npmcn.com/package/%40exodus/dependency-injection/

版本：3\.3\.1
npm 元数据更新时间：2026-10-13T17:15:50.992Z
中文译文更新时间：2026-11-14T04:02:06.796Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40exodus/dependency-injection
原文对照：https://npmcn.com/package/%40exodus/dependency-injection/?lang=original
项目主页：https://github.com/ExodusMovement/exodus/tree/master/libs/libraries/dependency-injection
源码仓库：https://github.com/ExodusMovement/exodus

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：29.9 kB，16 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：1 个
- 首次发布：2022-11-22T13:17:42.272Z
- 最新版本发布：2026-10-13T17:15:50.814Z
- 近 30 天下载量：12533（2026-10-14 至 2026-11-12，npm 官方下载统计）
- 已发布版本数：23（近 12 个月 2 个）

## 中文简介

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

## 安装

```sh
npm install @exodus/dependency-injection
```

也可以使用：`pnpm add @exodus/dependency-injection`、`yarn add @exodus/dependency-injection`、`bun add @exodus/dependency-injection`

## README

# @ exodus/ 依赖注射

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

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

```js
[
  ...,
  {
    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` 是一个特定值.

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

## 使用量

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

```js
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'],
  },
])
```

### 压倒性的依赖关系

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

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

container.resolve()

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

### 可选依赖关系

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

```js
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` 在容器一级通过建造器,或在单个节点一级。 见 [实例](https://npmcn.com/package/%40exodus/dependency-injection/__tests__/index.test.ts) 在测试.

## 已知问题/局限性

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

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

## 示例(无标题)

见 [无头](https://npmcn.com/package/sdks/argo/src/index.js) 作为真实世界的e2e实例,初始化了国际奥委会,并利用了 多个预处理器.

## 理由

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

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

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

## 杂项( 仅实现过度)

检查出来 [@ exodus/ 依赖性预处理器](https://npmcn.com/package/%40exodus/dependency-preprocessors),使 `config` 财务报告和审定财务报表 `logger` 以上叙述的特殊情况.

## 常见问题

### @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 和提交记录判断。

