2013-04-22 17:46 "@banq
"的内容
窃不敢苟同,我们不应该陷入命令和事件区分的死胡同。

有时命令发出本身也是一种事件,比如司令部发令枪响了等等。 ...

确实.
可能我理解不对, 但这样是否就是一种 以表现层为主导的思想了, 领域层反而要去关注上层发生了什么. winform或者js就是这种思想, onClick=....虽然确实适用

我觉得MVC的引入一定程度上就是为了解决这个问题, 把关注点转移到model上, 关注model发生了什么, 而不是view发生了什么.
而至于View 正在 发生的事件, 交给controller或者view自己处理. 这是发出命令的地方, 但它不是关注点.

司令部开枪只是表现层发生的事件,它可能有吹号角之类的其他形式, 连长作为model不可能去关注每一种形式, 它应该被转换为一个 "开战" 命令, 并且必须执行!

总之, 鄙人以为, 如果"进行时"的事件存在, 也只应当存在于domain以外.
或者说, 需要被持久化的事件, 一定是过去时的.

[该贴被2102于2013-04-22 18:55修改过]

触发event, 进行request;
执行command, 进行response;

event, 描述系统外部输入哪些什么信息,转化为请求;(Observer)
command, 描述系统内部对怎么处理这些请求,返回响应。(Command)

EventSourcing从名字上针对Event,可是redo/undo其实现,一般是针对Command的。当然,没有Ctrl+Z或Ctrl+Y触发的事件,也就不能Sourcing了。

比如GEF,一个在Eclipse社区应用极其广泛的图形编辑框架,其内部实现就是通过Command+CommandStack,来支持redo/undo机制。有兴趣的可以研究一下,代码实现还是不错的,除了大量的设计模式,也可以看到MVC、CQRS、DCI范式的影子,比如undo/redo的支持,编辑(command)与渲染(observer)的分离,Controller器似乎就是一个Context, 安装各种各样的编辑策略(EditPolicy)--即角色,等等。



十几年前,有专业的团队研究基于事件模型构建Web服务,好像并没有取得很大成功。
http://www.isr.uci.edu/events/twist/wisen98/
里头有不少文章,比如在该页面上就可以找到对事件的解释:
http://www.isr.uci.edu/events/twist/wisen98/presentations/Rosenblum/

事件模型,有可能更适合构建Web应用(在UI领域应用太广泛了),而不是构建Web服务。也许我们需要返璞归真,多了解一点REST,否则真可能重蹈覆辙(这仅仅是个善意的提醒,可略之)。


[该贴被jdon007于2013-04-22 20:23修改过]

事件到底是现在还是过去,我们首先要搞清楚,现在与过去的区别。

在时间轴上,现在是点,过去是线,过去也只是过去的现在。所以说,现在的事件与过去的事件,实际上是不相干的。

过去的事件,是从事件“外部”观看过去,看到过去的现在。
现在的事件,是从事件“内部”观看事件本身,看到事件是“如何进行”的。

综上所述,这两个只是词一样,但角度完全不同。