我有两种类型的事件:有条件启动佐贺
- PersonChanged
- PersonAddressChanged。
当创建新人(和新地址)(创建或更新类型)时,他们两个都正在发布。
当创建一个新的人两个事件公布:PersonChanged和PersonAddressChanged(按顺序)。但是,因为NServiceBus
是异步的,所以它们可以按任意顺序处理。并且,当地址更改(对于现有人员)时,不存在PersonChanged事件,只有PersonAddressChanged事件。
我想写PersonAddressChanged事件的处理程序,这将:
- 检查,如果该人是在数据库
- 如果是的话那么就进行更新
- 如果没有再启动的传奇,等待PersonChanged事件(假设它是一个新的人)
而在PersonChanged事件中,我需要插入的人的数据库,找到传奇和运行处理程序PersonAddressChangedØ再次。
我可以用NServiceBus传奇故事实现这一目标?我不能认为消息处理的顺序应该是PersonChanged → PersonAddressChanged
,因为有时候不会有任何特定地址更改的PersonChanged事件。
我喜欢这个解决方案,但我得到以下错误:'NHibernate.Event.Default.AbstractFlushingEventListener-无法与会话NHibernate.PropertyValueException同步数据库状态:为Namespace.PersonSaga.PendingAddressChanged ---> System.IndexOutOfRangeException脱水属性值出错:该计数= 29'的SqlParameterCollection的索引29无效。有任何想法吗? – bpiec
@bpiec:你的事件是作为接口还是具体类来实现的? NServiceBus生成围绕接口的代理类,NHibernate可能不喜欢。尝试用该类的内容替换PersonAddressChanged属性(即,如果'Person PersonAddressChanged {public string Address {get; set;} public Guid PersonId {get; set;}}',然后将这两个参数移入' MySagaDataType'并将它们分开设置) – carlpett
我在Saga类中添加了多个属性,每个属性都包含相同名称的属性,NSB在SQL Server中生成错误的表,然后无法保留传奇:(无所谓,我会尽力找到解决方法,但答案是我正在寻找! – bpiec