REST与DDD 之前在为什么要使用MVC+REST+CQRS架构我曾经提出DDD是核心,REST是壳的观点,我想在这里详细谈谈我的思路。今天正好看看到老外一篇博文Why REST is so important:按这里,他认为,REST的核心概念应该是Representional State Transfer,中文意思是将状态转移显现出来,该文举例:Marcus是一个农民。他有一个牧场,有4头猪,12只鸡和3头牛。那么模拟客户端与之交谈,那么我肯定首先询问牧场的状态:“状态?”Marcus 回答:“有4头猪,12只鸡和3头牛”。这是最简单的将状态显现的案例,Marcus用语句“有4头猪,12只鸡和3头牛”将他的牧场状态转给了我。那么如何以REST方式让Marcus加两头牛到它的牧场呢?我们经常会范的错误是,你会说:“Marcus, 请加两头牛到你的牧场”。请注意,我们在这里转换了状态吗?没有,我们这里表达的是动词,有面向函数风格,但是这种表述方式其实是RPC( remote procedure


var tx = new Transaction();
tx.Post(amount, fromAccount, toAccount);
transactionRepository.Store(tx);


这是调用Transaction这个聚合根的post方法。方法内部代码:


public void Post(decimal amount, string fromAccount, string toAccount)
{
this.Apply(new AccountDebited(amount, fromAccount));
this.Apply(new AccountCredited(amount, toAccount));
}


将转账命令(转账上游事件)分为两个事件,AccountDebited和AccountCredited,账户借款和账户贷款,这样保证借贷平衡。然后根据借贷状态切换,还有更多子状态,EventStore应该是这些和状态直接有关的事件,间接有关事件没有必要记录,这样在事件回放时才能重现状态真实改变历史。


总结,上面总体架构涉及到是:REST+CQRS+DDD Aggregate + Domain Events + EventSourcing

https://www.jdon.com/45622