从业务层使用邮政库

Kas*_*sem 5 email asp.net-mvc controller asp.net-mvc-3 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和我的业务层之间没有完全分离,因此这个领域可能会使用更多的重构 - 我现在无法做到这一点,因为我的时间紧迫.

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

问题:

我有这样的情况,我需要让我的业务层内的私人方法向用户发送电子邮件.我之所以无法在Action方法中执行此操作,是因为有许多代码路径最终会调用此私有方法.所以它并不是特定于一个Action方法.

建议的解决方案:

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

但我觉得这个解决方案有点瑕疵和黑客.所以我真的想听听一些关于如何解决这个问题的想法.

Jaf*_*fin 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);
    }
}
Run Code Online (Sandbox Code Playgroud)