Nou*_*uny 7 c# wpf nservicebus cqrs event-sourcing
我正在努力解决这个架构问题,我们的系统正在使用NService Bus,并使用NEventStore和NES实现带有EventSourcing的DDD.客户端应用程序是WPF
我仍然无法确定更新UI的最佳做法是什么,例如:我有一个用于创建的UI(Batch {Id,StartDate,EndDate等...}),在用户点击保存后,我正在发送一个命令(CreateBatch),
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc });
Run Code Online (Sandbox Code Playgroud)
现在,
选项1
我可以注册回复如下:
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();});
}
Run Code Online (Sandbox Code Playgroud)
在服务器端:
public void Hanlde(CreateBatch cmd){
//initiate aggregate and save it.
Bus.Return( /*What ?? Success Code?*/);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何处理错误?(验证错误,例如已经在同一天开始批量生产?),因为你只能返回int或string !!
选项2:
发送命令,关闭窗口,假设记录已添加到主网格中,直到用户刷新网格并从ReadModel数据库中获取真实数据,或者发现该记录尚未添加但不知道发生了什么!
private void btnSave_Click(object sender,EventsArg e){
Bus.Send<CreateBatch> (batch => {batch.Id = Guid.NewGuid(); .... etc });
Close();
}
Run Code Online (Sandbox Code Playgroud)
选项#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.
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有更好的选择,或对上述选项有任何建议,甚至有关如何处理此类情况的一些链接,我将不胜感激.
谢谢.
将消息传递到这样的解决方案中的一个重要原则是确保命令几乎不会失败(正如@Gope在评论中提到的那样).
这意味着在发送消息之前,应在客户端执行各种验证检查.
现在,即使在进行客户端验证时,您仍然可以接触竞争条件 - 2个用户同时创建批处理,以某种方式相互冲突.处理此问题的方法是查看用户意图,可能更改任务的性质以及UI,以使新命令即使在并行处理的情况下也能成功.
就像对解决方案的简单抨击一样,您可以重新定义逻辑以为批处理引入新状态 - 如"冲突",如果另一批处理同时启动,则将设置该状态.这样命令成功(创建批处理),然后使用SignalR之类的东西将此状态的通知推回给用户,以便他们可以进行纠正.
最后,您可能想要完全重新考虑使用消息传递,而只需要使用简单的2层同步解决方案.每种方法都有时间和地点.
归档时间: |
|
查看次数: |
633 次 |
最近记录: |