Architecture 在域驱动体系结构中包括业务逻辑的位置

Architecture 在域驱动体系结构中包括业务逻辑的位置,architecture,domain-driven-design,webforms,Architecture,Domain Driven Design,Webforms,我正在努力学习有效的DDD实践,但有一个基本问题我想弄清楚 我正在使用ASP.NET WebForms,我正在创建一个用户下订单的场景。提交订单时,隐藏代码检索用户,根据表单上的输入构建订单,调用user.PlaceOrder()方法执行将订单对象添加到用户的订单集合,并调用存储库将记录保存到数据库中。这相当简单明了 现在,我需要添加逻辑来发送订单确认电子邮件,但我真的不确定将此代码放置在正确的位置或调用它的位置。在过去,我只是简单地将代码放在代码后面,并在构建订单的同时调用它,但我想更接近可靠

我正在努力学习有效的DDD实践,但有一个基本问题我想弄清楚

我正在使用ASP.NET WebForms,我正在创建一个用户下订单的场景。提交订单时,隐藏代码检索用户,根据表单上的输入构建订单,调用user.PlaceOrder()方法执行将订单对象添加到用户的订单集合,并调用存储库将记录保存到数据库中。这相当简单明了

现在,我需要添加逻辑来发送订单确认电子邮件,但我真的不确定将此代码放置在正确的位置或调用它的位置。在过去,我只是简单地将代码放在代码后面,并在构建订单的同时调用它,但我想更接近可靠的适当架构,所以我想获得一些信息


谢谢你的帮助

我要做的是为所有逻辑引入一个逻辑层,codebehind仅用于处理请求,而存储库仅用于crud操作,这样您就可以将逻辑与应用程序的其余部分完美分离,并且易于测试

我要做的是为codebehind仅用于的所有逻辑引入一个逻辑层处理请求和存储库仅用于crud操作,这样可以将逻辑与应用程序的其余部分完美分离,并且易于测试。在订单保存到数据库后,最好异步发送确认电子邮件。我将介绍某种消息总线(如NServiceBus)来处理这种情况。在保存订单的同一事务中,在总线上发布消息“订单已创建”。这是一个订阅此邮件并向客户发送电子邮件的处理程序


为什么是异步的?因为SMTP服务器有失败的倾向,发送电子邮件可能是一项相当长的任务,长时间阻塞数据库表可能会导致死锁。我鼓励你看看:他是NServiceBus的作者,在博客上写了很多类似于确认电子邮件的案例。

在订单保存到数据库后,最好异步发送确认电子邮件。我将介绍某种消息总线(如NServiceBus)来处理这种情况。在保存订单的同一事务中,在总线上发布消息“订单已创建”。这是一个订阅此邮件并向客户发送电子邮件的处理程序


为什么是异步的?因为SMTP服务器有失败的倾向,发送电子邮件可能是一项相当长的任务,长时间阻塞数据库表可能会导致死锁。我鼓励你看看:他是NServiceBus的作者,写了很多类似于你的确认邮件的案例。

对我来说,我会尽可能地将所有东西都放在实体附近。过了一段时间,你会发现有些地方的情况比其他地方更适合。例如,可以仅基于实体的给定实例确定的业务逻辑应该在实体中。如果它需要更多的域知识,那么它可能属于域服务

我将我的逻辑大致分为三个方面:

  • 实体逻辑
  • 域服务逻辑
  • 应用程序服务逻辑
例如,应用程序逻辑就是我注册域事件的地方。我个人认为,电子邮件不属于这个领域。这是一种需求,而不是一种逻辑。如果当时我有一个监听器,域可能会引发OrderSubmitted()事件,监听器有责任对其执行操作。事件属于域,因为它描述的是域上下文中的重要事件。然而,在我看来,应用程序对此的响应方式是不同的


正如Syznmon提到的,这是一个很好的资源。不过,我强烈推荐,无论是,还是他所做的演示。

对我来说,我会尽可能地让一切都接近实体。过了一段时间,你会发现有些地方的情况比其他地方更适合。例如,可以仅基于实体的给定实例确定的业务逻辑应该在实体中。如果它需要更多的域知识,那么它可能属于域服务

我将我的逻辑大致分为三个方面:

  • 实体逻辑
  • 域服务逻辑
  • 应用程序服务逻辑
例如,应用程序逻辑就是我注册域事件的地方。我个人认为,电子邮件不属于这个领域。这是一种需求,而不是一种逻辑。如果当时我有一个监听器,域可能会引发OrderSubmitted()事件,监听器有责任对其执行操作。事件属于域,因为它描述的是域上下文中的重要事件。然而,在我看来,应用程序对此的响应方式是不同的


正如Syznmon提到的,这是一个很好的资源。不过,我强烈建议您使用ASP.NET MVC,以及他所做的演示。

如果您愿意使用ASP.NET MVC,则可能会使您更难将内容放到需要的地方。ASP.NET似乎太容易将
内容
放在代码背后。我不能在这个项目中使用它,因为它是一个庞大的代码库。为了我自己的利益,如果它是MVC应用程序,我将把这个逻辑放在哪里?在控制器中?如果你愿意使用ASP.NET MVC,它可能会让你更难把东西放在需要的地方。ASP.NET似乎太容易将
内容
放在代码背后。我不能在这个项目中使用它,因为它是一个庞大的代码库。为了我自己的利益,我应该把这个逻辑放在哪里