我正在尝试找出放置代码以在我的Asp.net MVC应用程序中发送电子邮件的最佳区域。现在我的应用程序设置在2个VS项目中,将业务层与表示层分开。我试图设置一种情况,当用户重置密码时,在业务逻辑更改密码后,服务器将使用新生成的密码向用户发送电子邮件。
我是否应该从业务层(业务层重置密码之后)或表示层(业务层返回成功结果之后)调用代码发送电子邮件(包括电子邮件的外观数据) ?
答案 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中,我想,为了简单起见,但我赞成完全抽象出来,在这种情况下,我会像处理数据一样对待它访问。
在我对世界的看法中,你可以把它放在两个地方:
注意:自我推销提醒! - 取自我自己的一篇文章:http://morphological.wordpress.com/2011/08/29/5-layer-architecture/
答案 2 :(得分:3)
发送电子邮件不属于表示层,但可以使用“专用表示层”来确定电子邮件的外观(设计,主题等)。
每个“层”实际上可以由几个独立的组件组成 例如。你可以拥有多个视图。
答案 3 :(得分:3)
我更喜欢将事物视为组件,可以使用依赖注入将其切换出来。
使用业务层中的具体实现创建一个IEmailService接口。
将它注入您的控制器。
让Controller使用Model创建并生成视图(来自模板的电子邮件),并调用IEmailService实现来实际发送它。
IEmailService在测试控制器时变得很容易模拟。
答案 4 :(得分:0)
发送电子邮件是业务层功能。您将拥有一个mailhandler类,其中包含一个将发送消息并处理异常的方法。