从业务层使用邮政库

时间:2012-02-05 11:11:11

标签: asp.net-mvc asp.net-mvc-3 email controller postal

我有一个使用ASP.NET MVC3构建的网站,其分层如下:

  • ProjectName.Shared(模型+服务合同)
  • ProjectName.Infrastructure
  • ProjectName.Data
  • ProjectName.Data.Sql
  • ProjectName.Managers(业务层)
  • ProjectName.Services(WCF服务)
  • ProjectName.UI.Main(ASP.NET MVC3应用程序)

这实际上是我最近在重构之后提出的结构。不幸的是,UI和我的业务层之间没有完全分离,因此这个领域可能会使用更多的重构 - 我现在无法做到这一点,因为我的时间紧迫。

至于现在,我的客户已经请求了一些新功能,包括在发生某些事件后向用户发送电子邮件。网站目前发送电子邮件的方式是使用迄今为止表现出色的Postal库。这发生在MVC Web应用程序中,这与我对新功能的情况不同......

问题:

我遇到的情况是,我需要在业务层内部使用私有方法向用户发送电子邮件。我在Action方法中不能这样做的原因是因为有许多代码路径最终会调用这个私有方法。所以它并不是特定于一种Action方法。

建议的解决方案:

我的想法是创建一个 EmailsController ,我可以通过业务层内的HTTP-POST调用来调用它的方法。然后,我将传递通过Action方法的参数发送电子邮件所需的参数。

但我觉得这个解决方案有点瑕疵和黑客。所以我真的很想听听如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

你能不能将你的电子邮件逻辑包装在服务层或基础设施之后,或者从控制器调用它,并通过你的构造函数注入服务? 您对业务层执行相同操作。除非邮政对象需要继承到asp.net?

namespace ProjectName.Infrastructure
{
    public interface IEmailService
    {
        void SendEmail(string address, string content)
        {
        }
    }

    public class EmailService : IEmailService
    {
        private void SendEmail(string address, string content)
        {
            //...send email via Postal
        }
    }
}

public class ControllerA
{
    private IEmailService emailService;

    public ControllerA()
    {
        emailService = new EmailService();
    }

    public ActionResult SendEmail(ViewModel model)
    {
        emailService.SendEmail(model.address, model.content);
    }
}