有关事件的一点疑问

事件被领域模型发布

看到最多的例子就是一个类,比如 User 类



//User类
public class User
{
public Guid Id { get; private set; }
public string Name { get; private set; }

private void OnChangeName(ChangedUserName evnt)
{
this.Name = evnt.Name;
}
public void ChangeName(string name)
{
this.ApplyEvent(new ChangedUserName { Name = name });
}
}
//事件
public class ChangedUserName
{
public string Name { get; set; }
}

不解的是
为什么非得通过 User.ChangeName 来发布事件到总线
然后事件被总线推送到User来,才会去执行OnChangeName

常说事件的都是过去式的,而此时事件并未真正的执行过

按照我的理解,如果事件是过去式的,那么应该在User.ChangeName,改变User的状态后,才会去发布ChangedUserName事件才对呀!

有答案了,只是被“看起来”的外观迷惑了

2012-11-29 07:10 "@banq"的内容
domain event 一定是过去式的event吗。 ...

你好banq, 麻烦你花几分钟,给我上上课

我想听听你的看法

2012-11-30 02:24 "@tbyes"的内容
麻烦你花几分钟,给我上上课

我想听听你的看法 ...

状态写成过去式比较容易理解,事件搞成过去式,可能还是静态思维导致,如果把事件看出正在发生函数动作,就不应该是过去式,而应该是正在发生的事件。

对事件进行溯源也就是Event sourcing,那么需要把事件当成数据,这时事件实际就是状态的代名词,使用过去式比较让人理解。所以,如果你需要对事件进行溯源,可以取过去式,在动词后面加一个ed表示完成了。其实这个事件是否真正完成,必须有一定状态来表示。

2012-11-30 11:22 "@banq"的内容
状态写成过去式比较容易理解,事件搞成过去式,可能还是静态思维导致,如果把事件看出正在发生函数动作,就不应该是过去式,而应该是正在发生的事件。

对事件进行溯源也就是Event sourcing,那么需要把事件当成数据,这时事件实际就是状态的 ...

谢谢,的确点通了心里的疑问

再回到帖子头,虽然是C的代码,我也翻看了JS和其它一些人的作品,无一例外,都是通过一个公开的函数来引发事件,在通过总线回交,到根里执行,再然后才会被总线发布。

这样是否是多此一举了呢?
为什么不在ChangeName里,先对自身状态进行更改,之后发布到总线推出去?

2012-12-02 15:07 "@tbyes"的内容
这样是否是多此一举了呢?
为什么不在ChangeName里,先对自身状态进行更改,之后发布到总线推出去? ...

事件发生有发生端和接受端,事件发生一般是由UI命令引起的,在一个领域分层结构中,事件发生端可能在Application层,然后激活领域层的领域对象,领域对象再分发到总线指挥各种基础设施,这是一种CQRS+Event Sourcing架构,如下图:


[该贴被banq于2012-12-02 17:12修改过]

2012-12-02 17:12 "@banq"的内容
事件发生有发生端和接受端,事件发生一般是由UI命令引起的,在一个领域分层结构中,事件发生端可能在Application层,然后激活领域层的领域对象 ...

之前我以为事件只能由领域对象来触发,然后又由领域对象来监听。当时还在想,这样做有多麻烦

按照您说的,事件有发生端,和接收端。
那也就是意味着,一般事件基本都是由
UI->Command->Command Handler->调用领域对象,进行业务->领域对象发布事件->Event Bus->分发给其它监听者

是这样么