Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 从业务层使用邮政图书馆_Asp.net Mvc_Asp.net Mvc 3_Email_Controller_Postal - Fatal编程技术网

Asp.net mvc 从业务层使用邮政图书馆

Asp.net mvc 从业务层使用邮政图书馆,asp.net-mvc,asp.net-mvc-3,email,controller,postal,Asp.net Mvc,Asp.net Mvc 3,Email,Controller,Postal,我有一个使用ASP.NET MVC3构建的网站,其分层如下: ProjectName.Shared(模型+服务合同) 项目名称.基础设施 ProjectName.Data ProjectName.Data.Sql ProjectName.Managers(业务层) ProjectName.Services(WCF服务) ProjectName.UI.Main(ASP.NET MVC3应用程序) 这实际上是我最近经过一些重构后提出的结构。不幸的是,UI和我的业务层之间没有完全分离,因此这个领域

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

  • ProjectName.Shared(模型+服务合同)
  • 项目名称.基础设施
  • ProjectName.Data
  • ProjectName.Data.Sql
  • ProjectName.Managers(业务层)
  • ProjectName.Services(WCF服务)
  • ProjectName.UI.Main(ASP.NET MVC3应用程序)
这实际上是我最近经过一些重构后提出的结构。不幸的是,UI和我的业务层之间没有完全分离,因此这个领域可能需要更多的重构——我现在不能这样做,因为我的最后期限很紧

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

问题:

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

建议的解决方案:

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


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

你能不能把你的电子邮件逻辑包装在服务层或基础设施或其他什么东西后面,从控制器调用它,然后通过构造器注入服务? 对业务层也可以这样做。除非postal对象需要继承到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);
    }
}

这正是我在求助于依赖ASP.NETMVC的Postal之前所拥有的。它允许您将HTML电子邮件创建为ASP.NET MVC视图,这些视图绑定到从控制器的操作方法发送的@Model对象。Postal直接依赖于MVC视图和用于生成电子邮件的razor引擎这一事实是这里的一个大问题。我也面临着这个问题,很想知道是否有更好的方法。我知道这已经有一年了,但Postal会像内置的Razor视图引擎一样使用RazorEngine(),如下所述: