【问题标题】:Should I send e-mails in the service layer or in the controller layer?我应该在服务层还是在控制器层发送电子邮件?
【发布时间】:2010-10-22 03:19:16
【问题描述】:

我在 ASP.NET 中使用 MVC 模式,使用服务 (BLL) 和存储库层进行数据管理。在某些情况下,当通过我们的网站发送新请求时,我想发送一封自动电子邮件。这封电子邮件应该在架构的哪一层发送?在控制器层还是服务层?我在考虑服务层,因为那是“业务逻辑”应该去的地方,但我不能 100% 确定这在语义上是否正确。

编辑:当我说“新请求”时,我的意思是用户采取了保存到某种数据存储的操作。例如,他们在网站上创建了一个新的“项目”。所以请求将通过控制器 > 服务 > 存储库层。

【问题讨论】:

    标签: asp.net asp.net-mvc


    【解决方案1】:

    我会把它放在服务层。

    【讨论】:

      【解决方案2】:

      同意。它们属于服务层。控制器应该很薄;只需调用适当的业务/数据/任何类并将数据放在一致的视图中即可。

      【讨论】:

        【解决方案3】:

        我总是设计我的业务层,以便它能够工作,无论数据通过何种媒介呈现。因此,例如,如果我要在创建新帐户时发送电子邮件,无论用户是通过网站还是桌面应用程序创建帐户,我都希望这种情况发生。在这种情况下,电子邮件的发送将发生在业务层,因为它对两种媒介都是通用的。

        【讨论】:

          【解决方案4】:

          在 mix 和 pdc phill 的演讲中,

          thin controllers, fat models
          

          【讨论】:

            【解决方案5】:

            实际上,我的控制器中只有控制器操作。所有其他业务逻辑都由其他层处理,无论它可能是什么。

            【讨论】:

              【解决方案6】:

              大多数情况下,您可以通过考虑如果您的 BLL 前面有一个 Web 服务层或一个 Windows 应用程序而不是您的 Web 应用程序,您希望发生什么来澄清此类问题。您还希望发送相同的电子邮件吗?如果答案是肯定的,那么发送电子邮件是您的商业模式的一部分,它应该放在 BLL 中。如果答案是否定的,那么发送电子邮件实际上是应用程序逻辑,它应该进入您的应用程序层。

              【讨论】:

              • 这是一种非常聪明的思考方式...感谢您的提示!
              【解决方案7】:

              如果它是核心业务功能,我会将其放在服务层。

              但是,我可能会抽象一个“MailSender”类,这样我的服务层就不会明确地与以特定方式发送电子邮件相关联(例如,使用 System.Web.Mail)。您可能希望稍后使用另一种方法(例如,使用队列异步发送邮件)。它还允许您在不向任何人发送垃圾邮件的情况下安全地进行单元测试(通过将 MailSender 替换为实际上不发送任何邮件的邮件):)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-08-09
                • 2013-01-15
                • 2011-10-02
                • 2023-04-07
                • 1970-01-01
                • 2019-10-27
                • 2021-08-20
                相关资源
                最近更新 更多