0

我正在开发具有以下层的 N 层 .NET 应用程序:

  • 介绍
  • 应用
  • 领域
  • 基础设施(包含持久性和常用实用功能,如电子邮件)

在我的申请中,某个请求被批准了。一旦获得批准,必须执行以下 4 个步骤:

  1. 将产品标签代码分配给请求中的已发行产品。
  2. 将请求状态从“正在处理”更新为“订单已完成”</li>
  3. 向请求者发送一封电子邮件,说明他们的产品已准备好取货
  4. 向请求者的经理发送一封电子邮件,告知他们已向他们的员工提供了什么以及他们批准的产品请求的副本

上述步骤必须是原子操作的一部分,这意味着它们必须全部完成,否则操作将被取消。我正在考虑让应用层指导请求存储库和持久层执行以下任务:

  1. 应用层请求请求存储库执行步骤 1 和 2 作为工作单元事务
  2. 应用层请求基础设施层执行步骤 3 和 4。

我不确定应用层是否应该这样做。我认为这是因为前两个操作需要联系我在域层中避免做的存储库。最后两个步骤涉及基础设施层,域层可以通过依赖注入实例与之对话。按照这个逻辑,应用层并不要求领域层做任何事情。当你有一个应用层时,这通常是这样的多步骤过程吗?还是我在这里错过了什么?

我知道一个名为 Windows Workflow 的框架,但我不确定这在这种情况下是否会有所帮助,因为这个多步骤过程不涉及处理步骤中的人机交互,而事情可能会等待几天。如果我不需要的话,我也不想让应用程序过于复杂。

提前致谢。

4

1 回答 1

4

您问题中的第 1 步和第 2 步对我来说听起来像是领域逻辑。所以不,这不好。这两个步骤应该在域中进行。您可以执行以下操作:

  1. 在应用程序服务中,加载相关的聚合(可能是Request)。

  2. 要么调用在 上执行步骤 1 和 2 的Request操作,要么(如果该操作实际上不属于Request)调用执行这两个步骤的域服务。

  3. 域操作完成后,应用服务可以将修改后的内容保存Request回数据库。

  4. 如果上述步骤成功,您现在可以发送电子邮件。您应该有某种重试机制,以便最终发送电子邮件,即使存在临时问题。

如果第二步中的更改修改了多个聚合,则该过程会稍微复杂一些。评论中提到的 Sagas 是解决此问题的一种方法。尽管如此,各个更改都是域操作,因此请相应地对其进行建模。

正如 plalx 在评论中所建议的那样,如果您有一个事件基础设施,则可以将电子邮件的发送分流给域事件消费者。这通常可以免费解决重试机制。

于 2016-02-08T06:45:56.463 回答