我应该在服务层或控制器层发送电子邮件吗?

时间:2009-04-27 18:37:36

标签: asp.net asp.net-mvc

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

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

7 个答案:

答案 0 :(得分:16)

同意。它们属于服务层。控制器非常薄;只需调用适当的业务/数据/任何类,并在重合的视图中删除数据。

答案 1 :(得分:5)

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

答案 2 :(得分:5)

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

答案 3 :(得分:4)

我会把它放在服务层。

答案 4 :(得分:1)

在mix和pdc phill在他的演讲中说,

thin controllers, fat models

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

然而,我可能会抽象出一个“MailSender”类,以便我的服务层没有明确地依赖于以特定方式发送电子邮件(例如使用System.Web.Mail)。您可能希望稍后使用其他方法(例如,使用队列异步发送邮件)。它还允许您安全地进行单元测试而不会向任何人发送垃圾邮件(通过将MailSender替换为实际上不发送任何邮件的邮件):)