96SEO 2026-09-06 19:33 37
disintegrate 并不是一个“全能框架”,而是一套 trait 的组合,帮助你把业务逻辑写成纯函数:
Decision定义业务操作的意图,主要方法是
process -> Result。Error> StateMutate描述事件如何折叠回状态,主要方法是
mutateStateQuery事件流查询。这三者共同构成闭环:加载事件 → 折叠成当前状态 → 根据状态产生新事件 → 新事件追加到流。说起来,框架负责加载、折叠与持久化。你只需实现事件结构、折叠逻辑还有每个操作的意图。说起来,

在传统 Service 层里业务往往被拆散到校验、状态切换、SQL 拼接、日志等多处。一个“取消订单”功能可能涉及数百行代码,还夹杂两处if判断——过了两周就不敢改。
这导致的观点是,
// backend/src/domain/crm/order/es/decisions.rs
pub struct CancelOrderDecision {
merchant_id: String。order_uuid: String,reason: String,updated_at: DateTime,operator_uuid: Option,}
impl Decision for CancelOrderDecision {
type Event = OrderEventEnvelope;type StateQuery = OrderState;type Error = String;说起来,fn state_query -> Self::StateQuery {
OrderState::new
}
fn process -> Result。Self::Error>{
let mut order = state.to_domain?,order.cancel)?,Ok
}
}
This single process` method reads current state,runs domain logic and emits events—no DB queries,no side‑effects.
// backend/src/domain/crm/order/es/state.rs
impl StateMutate for OrderState {
fn mutate {
match event {
OrderEvent::OrderCreated { merchant_id,order_uuid,status,.. } => {
self.exists = true;self.merchant_id = merchant_id;self.order_uuid = order_uuid;self.status = Some;// 初始化其他字段
}
OrderEvent::OrderStatusChanged { status。completed_at,updated_at,.. } => {
self.status = Some;self.completed_at = completed_at;self.updated_at = Some;}
OrderEvent::OrderCancelled { cancellation_reason。updated_at,.. } => {
self.status = Some.to_string);self.cancellation_reason = Some;self.completed_at = None;self.updated_at = Some;其实,}
// ...
}
}
}
No I/O or async – just field assignments.
// backend/src/domain/crm/order/es/state.rs
pub fn to_domain -> Result{
if!
self.exists{
return Err);}
Ok(Order{
说到uuid,self.order_uuid.clone。status: OrderStatus::parse.unwrap_or)?amount_cents:self.amount_cents,// ...
})
}
The returned Order is a normal domain object unaware of event sourcing.
// backend/src/domain/crm/order/es/decisions.rs
#
fn it_rejects_invalid_status_transition{
TestHarness::given)])
.when)
.n_err);}
The built‑in TeshHarness — a chainable API that folds everything into a few lines of code.
// backend/src/infrastructure/repositories/crm/orderrepositoryimpl.rs
async fn cancelorder(
&self,uuid:String,reason:String,…)>Result{
let decision maker =
disintegratepostgres::decisionmaker;
decisionmaker.make( CancelOrderDecision::new,operatoruuid) ).await?,
再看Self:,loadorderfromevents
}
``
decisionmaker.make` encapsulates four responsibilities:
1️⃣ Load history via state_query.
2️⃣ Fold it into current state with mutate.
3️⃣ Execute business logic through process.
4️⃣ Persist new events atomically.
The repository never touches business rules—just orchestrates pure functions.
| 聚合 | Decision 数 | 典型操作 |
|---|---|---|
| Order | 6 | Create / UpdateDetails / StatusChanged / Cancel / Assignment / SettlementSchedule |
| Schedule | 4 | Create / UpdateAssignment / StatusChanged / DeleteServiceRequest |
| ServiceRequest | 3 | Create / UpdateDetails / StatusChanged
|
| 场景 | 原始痛点 | disintegrate 解法 |
|---|---|---|
| 业务耦合 | Service 层混杂 SQL 与领域逻辑 | 决策与折叠分离,仅由纯函数决定行为 |
| 改动成本 | 修改一行就得跑容器+DB +复测 | 单元测试仅依赖内存数据。可快速迭代 |
| 测试可靠性 | 模拟 DB 或 mock 不稳定 | 所有方法可在本地 deterministically 执行 |
| 团队协作 | 难以定位责任边界 | 明确职责区块 |
如果你现在正面临上述问题,请考虑把业务逻辑抽象为纯函数。试试看它能否帮你把繁琐的 Service 层拆解开来?
项目已开源 GitHub 上,搜索 Pico‑CRM 可查看完整代码与示例。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback