5

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

  • ProjectName.Shared(模型+服务合同)
  • 项目名称.基础设施
  • 项目名称.数据
  • 项目名称.Data.Sql
  • ProjectName.Managers(业务层)
  • ProjectName.Services(WCF 服务)
  • ProjectName.UI.Main(ASP.NET MVC3 应用程序)

这实际上是我最近经过一些重构后提出的结构。不幸的是,UI 和我的业务层之间没有完全分离,所以这个领域可以使用更多的重构——我现在不能这样做,因为我的截止日期很紧。

就目前而言,我的客户要求一些新功能,包括在某些事件发生后向用户发送电子邮件。该网站目前发送电子邮件的方式是使用迄今为止做得很好的邮政图书馆。这发生在 MVC Web 应用程序中,这与我对新功能的情况不同......

问题:

我有一种情况,我需要在我的业务层中使用私有方法来向用户发送电子邮件。我不能在 Action 方法中执行此操作的原因是因为有许多代码路径最终会调用此私有方法。因此,它并不是真正特定于一种 Action 方法。

建议的解决方案:

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

但我确实发现这个解决方案有点缺陷和hacky。所以我真的很想听听一些关于如何解决这个问题的想法。

4

1 回答 1

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);
    }
}
于 2012-02-05T12:57:44.193 回答