2

我已经阅读了很多关于事件驱动架构的内容,这对我来说很有意义,但是给用户即时反馈的问题让我感到困惑。

假设有一个服务('EmployeeService')包含所有员工的列表。创建员工的业务逻辑位于此服务中。

另一个系统的 UI 使用此服务。要求是(无论您是否喜欢)它有一个员工网格,以及一个显示表单的“添加员工按钮”,当您提交表单时,它会将您返回到新员工所在的网格它。网格显示由服务计算的派生字段(这很重要!)。

传统上,在提交时,我会显示一个加载屏幕,同步发送一个 WCF 请求来注册员工,并在完成后转发到网格(现在肯定会有新员工)。

使用 EDA,在提交时,我会“触发并忘记”一个注册用户的命令 - 但是然后呢?我可以转发到网格,但有可能新员工可能还不在那里?假设一切正常,我可以手动添加到网格中,但是如何显示服务计算的派生数据?或者,如果尚未创建“新员工待定图形”,我可以在网格上显示它,然后让页面每隔几秒检查一次,直到它有?

这是一个常见的场景,那么常见的解决方案是什么?

4

2 回答 2

1

您可以在发送命令时注册回调并阻止直到命令完成。

如果您已下载 NServiceBus 包,只需参考 AsyncPagesMvc3 示例解决方案。它有一个你正在寻找的例子。

于 2012-08-10T02:59:42.233 回答
0

如果您EmployeeService是 SOA 服务,那么 Add Employee Button 也属于 EmployeeService。用户界面很简单,是多种服务的组合。您可以在处理员工创建和计算的客户端上本地部署一部分EmployeeService(如果计算不是一个复杂的计算)。

例如:

public class AddEmployeeView
{
   public IBus Bus { get; set; }    

   public void AddNewClicked() {
        // async calculate
        // store directly in the employee service database
        // or dispatch command internally
        // refresh employee list as the service is the only owner of that data
        Bus.Publish<NewEmployeeAdded>(m => { });
   }
}

所以以上AddEmployeeView属于EmployeeService. 独自一EmployeeService人知道如何计算和存储新员工(甚至在自己的数据库中),并且是事件的唯一合乎逻辑的发布者NewEmployeeAdded。这样就消除了您的复杂性。

于 2012-08-13T21:15:06.767 回答