对于具有多步骤过程的应用层来说,不使用域层是否可以

时间:2016-02-07 21:48:39

标签: .net domain-driven-design workflow-foundation-4 n-tier-architecture application-layer

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

  • 演示文稿
  • 应用
  • 基础设施(包含持久性和常见效用函数,如电子邮件)

在我的申请中的某个时刻,请求已获批准。一旦获得批准,有4个步骤必须按如下方式执行:

  1. 将产品标签代码分配给请求中的已发布产品。
  2. 将请求状态从“正在处理”更新为“已完成订单”
  3. 向请求者发送电子邮件,说明他们的产品已做好准备 拾取
  4. 发送电子邮件给请求者的经理,通知他们什么 他们的员工已经获得了他们的请求副本 批准用于产品
  5. 上述步骤必须是原子操作的一部分,这意味着必须完成所有操作或取消操作。 我正在考虑让应用层指示请求存储库和持久层来执行如下任务:

    1. Application Layer要求Request Repository执行 步骤1和2作为工作交易单元
    2. 应用层对Infrastructure层的请求 执行第3步和第4步。
    3. 我不确定应用层是否应该这样做。我认为这是因为前2个操作需要联系我在域层中避免过的存储库。最后两个步骤涉及基础设施层,域层可以通过依赖注入实例与之交谈。遵循此逻辑,应用层不会要求域层执行任何操作。当你有一个应用层时,这通常是这样的多步骤过程的方式吗?或者我在这里错过了什么?

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

      提前致谢。

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

    正如评论中的plalx所建议的那样,如果您有适当的事件基础架构,则可以将电子邮件的发送卸载到域事件使用者。这通常可以免费解决重试机制。