发送电子邮件是否属于应用程序的表示层或业务层?

时间:2011-04-20 21:31:00

标签: asp.net-mvc email architecture

我正在尝试找出放置代码以在我的Asp.net MVC应用程序中发送电子邮件的最佳区域。现在我的应用程序设置在2个VS项目中,将业务层与表示层分开。我试图设置一种情况,当用户重置密码时,在业务逻辑更改密码后,服务器将使用新生成的密码向用户发送电子邮件。

我是否应该从业务层(业务层重置密码之后)或表示层(业务层返回成功结果之后)调用代码发送电子邮件(包括电子邮件的外观数据) ?

5 个答案:

答案 0 :(得分:7)

发送电子邮件应该是业务层的一部分。

几周前我遇到了同样的问题,我正在使用asp.net mvc 3构建一个Web应用程序,它包含三个项目:存储库(DAL),服务(BLL),演示文稿(Web)

我的应用程序逻辑是在服务层实现的,所以我一直在寻找在服务层实现完全独立模块的最佳方式,以便向用户发送HTML电子邮件,以便我的服务层函数可以直接使用它,而不必将它带到表示层。

经过一番搜索后,我找到了一个由Kazi Manzur完成的优雅解决方案,他创建了一个电子邮件子系统,利用Razor Views在Web项目之外发送HTML /文本电子邮件。

Use Razor for Email Template outside ASP.NET MVC

从那时起我一直在使用他的子系统,并且它做得很好。

答案 1 :(得分:4)

我部分同意BobTodd,因为他建议你把它抽象出来。我(部分)不同意的唯一部分是关于它进入业务层。

发送电子邮件取决于某种物理实现 - 并且您不希望将BL绑定到与某些电子邮件提供商相关的外部依赖项。

在一个小项目中,你可以将它包含在BL中,我想,为了简单起见,但我赞成完全抽象出来,在这种情况下,我会像处理数据一样对待它访问。

在我对世界的看法中,你可以把它放在两个地方:

  • 作为您可能希望从任何地方呼叫的共享服务 - 并且因为它将被抽象出来,您将能够。
  • 作为/通过“外部服务适配器”,它也被抽象出来但只能从BL访问 - 这可能反过来暴露任何东西(如UI)可以调用的方法(如果你真的想要)。

5 Layer Architecture

注意:自我推销提醒! - 取自我自己的一篇文章:http://morphological.wordpress.com/2011/08/29/5-layer-architecture/

答案 2 :(得分:3)

发送电子邮件不属于表示层,但可以使用“专用表示层”来确定电子邮件的外观(设计,主题等)。

每个“层”实际上可以由几个独立的组件组成 例如。你可以拥有多个视图。

答案 3 :(得分:3)

我更喜欢将事物视为组件,可以使用依赖注入将其切换出来。

使用业务层中的具体实现创建一个IEmailService接口。

将它注入您的控制器。

让Controller使用Model创建并生成视图(来自模板的电子邮件),并调用IEmailService实现来实际发送它。

IEmailService在测试控制器时变得很容易模拟。

答案 4 :(得分:0)

发送电子邮件是业务层功能。您将拥有一个mailhandler类,其中包含一个将发送消息并处理异常的方法。

相关问题