# @effect-server-utils/unit-of-work 中文文档

规范地址：https://npmcn.com/package/%40effect-server-utils/unit-of-work/

版本：0\.1\.0-beta\.10
npm 元数据更新时间：2026-10-30T04:27:04.004Z
中文译文更新时间：2026-11-13T10:07:58.768Z
软件包许可：MIT

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

原始 npm 页面：https://www.npmjs.com/package/%40effect-server-utils/unit-of-work
原文对照：https://npmcn.com/package/%40effect-server-utils/unit-of-work/?lang=original
项目主页：https://dataquail.github.io/effect-server-utils
源码仓库：https://github.com/dataquail/effect-server-utils

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

- 包体积（解压后）：137 kB，53 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- peer 依赖：effect ^4\.0\.2，@effect-server-utils/cqrs ^0\.1\.0-beta\.10
- 首次发布：2026-08-26T23:27:17.589Z
- 最新版本发布：2026-10-30T04:27:03.630Z
- 近 30 天下载量：4316（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：9（近 12 个月 9 个）

## 中文简介

Effect 的单位- 工作边界: 重入原子弹端口, 覆盖主机交易的原始, 它给出的后交付@ effect- server- utils/ cqrs 事件总线

## 安装

```sh
npm install @effect-server-utils/unit-of-work
```

也可以使用：`pnpm add @effect-server-utils/unit-of-work`、`yarn add @effect-server-utils/unit-of-work`、`bun add @effect-server-utils/unit-of-work`

## README

# @ effect- server- utils/ 工作单位

工作单位边界 [效果](https://effect.website/): 重置原子学端口, 覆盖您的 自己的交易是原始的 承诺后交付 [`@effect-server-utils/cqrs`](https://www.npmjs.com/package/@effect-server-utils/cqrs)活动公交车.

```sh
pnpm add @effect-server-utils/unit-of-work @effect-server-utils/cqrs effect
```

两者 `effect` 财务报告和审定财务报表 `@effect-server-utils/cqrs` 是同伴的依赖关系.

## 为什么它是自己的包

CQRS软件包对交易没有意见. 它的活动巴士知道一些订阅者想要 要运行 _之后_ 无论产生了什么 活动已经结束, 它不知道什么"完成" 意思是,它把这些事件交给 `DeferralSink` 如果有上下文,然后在结尾运行 如果没有,则发送命令.

这个包裹就是沉入水中, 以及它承诺等待的边界。 安装它,当你 主机有一个数据存储器, 它的原子性您想要一个使用大小写能够声明; 把它和 公交车仍然工作,与 `subscribeAfterCommit` 变成"每个直接处理者" 处理器 二者之间不要改变.

## 你得到的东西

-   **`withUnitOfWork`** ——复写方用例适用一次,在其管末. 每个 寄存器内书写在一起或一起丢弃.
-   **`UnitOfWork`** ——它背后的端口,所以一个使用案例可以被单位测试以对抗通过 执行时从未命名数据存储器.
-   **`TransactionDriver`** - 你提供的唯一东西。 重新进入、推迟、排水命令和失败 孤立是这个软件包的; SQL 是你的.
-   **`PersistenceUnavailable`** ——瞬间存储失败 寄存器端口名称,所以一个模块的 `domain/` 可以在不进口基础设施的情况下加以描述.
-   **`@effect-server-utils/unit-of-work/testing`** —— 说 `PassThroughUnitOfWork` 和模拟驱动器,用于 测试其仓库是伪造的.

## 提供司机

```ts
import * as Effect from "effect/Effect";
import * as Layer from "effect/Layer";
import {
  PersistenceUnavailable,
  TransactionDriver,
  TransactionFailed,
} from "@effect-server-utils/unit-of-work";

// An adapter is responsible for making its own scope handle ambient to the effect
// it wraps, so a repository inside picks it up. Nothing about that handle appears
// in the port — if it did, every consumer's read path would have to name it.
export const TransactionDriverLive: Layer.Layer<TransactionDriver, never, Database> = Layer.effect(
  TransactionDriver,
  Effect.gen(function* () {
    const db = yield* Database;
    return TransactionDriver.of({
      withTransaction: (effect) => db.transaction(effect),
      withSavepoint: (effect) => db.savepoint(effect),
      isActive: db.hasOpenTransaction,
    });
  }),
);
```

## 宣布边界

```ts
import { withUnitOfWork } from "@effect-server-utils/unit-of-work";

// Declared once and visibly, rather than buried in an inner block that dispatched
// event handlers would silently join.
const placeOrder = (input: Input) =>
  Effect.gen(function* () {
    const order = yield* orders.insert(input);
    yield* eventBus.dispatch([OrderPlaced.make({ orderId: order.id })]);
    return order.id;
  }).pipe(withUnitOfWork);
```

`run` 重新输入 : 空呼打开了范围, 已经输入的呼叫需要保存点而不是 到达第二个连接。 所以一个从电话商内部发出的命令会加入进来, 呼叫者捕捉到的巢出故障 只会丢弃巢出范围.

`withUnitOfWork` 降职 `TransactionFailed` - 任何案件都无法对被拒绝的违法行为采取行动 叶子 `PersistenceUnavailable` 站立,就是运输边界变成503.

## 承诺后的事件

```ts
import { makeEventBus } from "@effect-server-utils/cqrs";
import { makeUnitOfWork } from "@effect-server-utils/unit-of-work";

// The boundary and the sink are installed together, because they are one decision:
// "after commit" has no meaning until something owns a commit.
const runtime = Layer.mergeAll(makeEventBus(), makeUnitOfWork()).pipe(
  Layer.provide(TransactionDriverLive),
);
```

有了这个线, `bus.subscribeAfterCommit(...)` 处理器一旦运行 _最外侧_ 工作单位 执行,每个单位在新的工作单位,所以其失败不能抵消它的反应,以及 排水管是不间断的,所以客户端挂断不会丢弃已经存在的反应 持久。 笼罩在地上,而后退则抛弃它所推迟的;笼罩在地上的人,仍犯罪 仍然消耗着自己的财富.

无工作单位的派遣是一个有标记的缺陷(`EventDispatchedOutsideUnitOfWork`更喜欢 而不是悄悄的送货——一旦你安装了边界,一个忘记了边界的调度就是: 一个虫子.

## 测试

```ts
import { PassThroughUnitOfWork } from "@effect-server-utils/unit-of-work/testing";
```

真实的边界与记忆驱动器:真正的再入,真正的承诺后命令,真正的 弃去回滚, 没有数据存储 。 更喜欢手卷式的通关,它往往得到 翻回案件错了.

## 文档

完整文档: [https://dataquail.github.io/effect-server-utils 页面存档备份,存于互联网档案馆](https://dataquail.github.io/effect-server-utils)

## 许可证

麻省理工学院

## 常见问题

### @effect-server-utils/unit-of-work 是什么？

Effect 的单位- 工作边界: 重入原子弹端口, 覆盖主机交易的原始, 它给出的后交付@ effect- server- utils/ cqrs 事件总线

### 如何安装 @effect-server-utils/unit-of-work？

在项目目录运行 npm install @effect-server-utils/unit-of-work，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：effect（^4\.0\.2）、@effect-server-utils/cqrs（^0\.1\.0-beta\.10）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @effect-server-utils/unit-of-work 支持 TypeScript 吗？

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

### @effect-server-utils/unit-of-work 支持 ESM 还是 CommonJS？

同时提供 ES Module 与 CommonJS 入口，import 和 require\(\) 都可以使用，打包工具会自动选择合适的版本。

### @effect-server-utils/unit-of-work 可以商用吗？

@effect-server-utils/unit-of-work 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @effect-server-utils/unit-of-work 的下载量有多少？

根据 npm 官方下载统计，@effect-server-utils/unit-of-work 在 2026/10/13 – 2026/11/11 这 30 天内被下载 4,316 次，日均约 144 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @effect-server-utils/unit-of-work 还在维护吗？

最新版本 0\.1\.0-beta\.10 发布于 2026/10/30（14 天前）；至今共发布 9 个版本，其中过去 12 个月发布了 9 个；首次发布于 2026/08/27。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

