繁体   English   中英

具有多步骤过程的应用程序层不使用域层是否可以?

[英]Is It Okay for an Application Layer with a multi-step process to not use the domain layer

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

  • 介绍
  • 应用
  • 基础结构(包含持久性和常见实用程序功能,如电子邮件)

在我的申请中的某个时刻,请求被批准。 批准后,必须执行以下4个步骤:

  1. 将产品标签代码分配给请求中的已发行产品。
  2. 将请求状态从“正在处理”更新为“订单已完成”
  3. 发送电子邮件给请求者,说明他们的产品已准备好提货
  4. 向请求者的经理发送电子邮件,告知他们所获得的雇员以及他们批准该产品的请求的副本

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

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

我不确定应用层是否应该这样做。 我认为这是因为前两个操作需要联系存储库,而我避免在域层中这样做。 最后两个步骤涉及域层可以通过依赖项注入实例与之对话的基础结构层。 按照这种逻辑,应用层不会要求域层执行任何操作。 当您具有应用程序层时,对于这样的多步骤过程,通常情况是这样吗? 还是我想念这里的东西?

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

提前致谢。

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

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

  2. 调用对Request执行第1步和第2步的操作,或者(如果该操作确实不属于Request )则调用执行这两个步骤的域服务。

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

  4. 如果上述步骤成功,则可以立即发送电子邮件。 您应该具有某种重试机制,以便即使有暂时性问题,也可以最终发送电子邮件。

如果第二步中的更改修改了一个以上的聚合,则过程将变得稍微复杂一些。 评论中提到的Sagas是解决此问题的一种方法。 尽管如此,单个更改仍是域操作,因此请对其进行建模。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM