我正在为解决架构问题而苦恼, 我们的系统使用NService Bus,使用NEventStore和NES实现DDD和事件源。 客户端应用程序是WPF
我仍然无法决定更新UI的最佳实践, 例如: 我有一个UI来创建(批次{Id,开始日期,结束日期等}),用户点击保存后,我发送一个命令(CreateBatch)。
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc });
现在, 选项一
我是否应该以以下方式注册以获得回复:
private void btnSave_Click(object sender,EventsArg e){
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc })
.Register<int>(c=> {
MessageBox.Show("Command Succeded");
Close();});
}
在服务器端:
public void Hanlde(CreateBatch cmd){
//initiate aggregate and save it.
Bus.Return( /*What ?? Success Code?*/);
}
在这种情况下,如何处理错误?(例如验证错误,例如在同一日期已经有一个批次开始了?),因为您只能返回int或string!! 选项#2: 发送命令,关闭窗口,假装记录已添加到主网格中,直到用户刷新网格并从ReadModel数据库中获取真实记录,或者发现记录尚未添加且没有任何线索!
private void btnSave_Click(object sender,EventsArg e){
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc });
Close();
}
选项#3
发送命令,关闭窗口,虚假地将记录添加到主网格中但标记为(正在进行),等待(BatchCreated)事件到来,检查它是否与之前发送的批次id相同,然后在网格中标记记录为已持久化。
private void btnSave_Click(object sender,EventsArg e){
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc });
Close();
}
public class BatchHandler : IHandleMessages<BatchCreated>
{
public void Handle(BatchCreated evnt)
{
if(SomeCachForSentIDS.Contains(evnt.BatchId)
///Code to refresh the row in the grid and reflect that the command succeeded.
}
}
如果您有更好的选择,或对提到的选项有建议,甚至有关于如何处理这种情况的链接,我将不胜感激。
谢谢。