@ effect- server- utils/ 工作单位
工作单位边界 效果: 重置原子学端口, 覆盖您的
自己的交易是原始的 承诺后交付
@effect-server-utils/cqrs活动公交车.
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和模拟驱动器,用于 测试其仓库是伪造的.
提供司机
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,
});
}),
);
宣布边界
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.
承诺后的事件
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更喜欢
而不是悄悄的送货——一旦你安装了边界,一个忘记了边界的调度就是:
一个虫子.
测试
import { PassThroughUnitOfWork } from "@effect-server-utils/unit-of-work/testing";
真实的边界与记忆驱动器:真正的再入,真正的承诺后命令,真正的 弃去回滚, 没有数据存储 。 更喜欢手卷式的通关,它往往得到 翻回案件错了.
文档
完整文档: https://dataquail.github.io/effect-server-utils 页面存档备份,存于互联网档案馆
许可证
麻省理工学院