1

尝试在也使用 Mvc.Unity4 的 MVC 应用程序中使用 Postal 时,我遇到了一个奇怪的问题。

我相信这个问题是由于无法访问HttpContext.

我尝试使用 Postal 从我的一个控制器内部发送电子邮件:

dynamic e = new Email("AccountActivation");
e.To = "name@email.com"
e.Send();

尝试发送电子邮件会导致以下异常Unity.Mvc4.UnityDependencyResolver

[NullReferenceException: Object reference not set to an instance of an object.]
   Unity.Mvc4.UnityDependencyResolver.get_ChildContainer() +57
   Unity.Mvc4.UnityDependencyResolver.GetService(Type serviceType) +241
   System.Web.Mvc.DefaultViewPageActivator.Create(ControllerContext controllerContext, Type type) +87
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +216
   Postal.EmailViewRenderer.RenderView(IView view, ViewDataDictionary viewData, ControllerContext controllerContext, ImageEmbedder imageEmbedder) +182
   Postal.EmailViewRenderer.Render(Email email, String viewName) +204
   Postal.EmailService.CreateMailMessage(Email email) +72
   Postal.EmailService.Send(Email email) +65

我对 Mvc.Unity4 不太熟悉,因为它是由不同的开发人员添加的。

抓住最后一根稻草,我确实尝试在 Application_Start 中注册正确的邮政类型。Unity 容器的初始化发生在Bootstrapper.cs

container.RegisterType<UsersController>(new InjectionConstructor());
container.RegisterInstance<IEmailService>(new EmailService());

在我的控制器中,我有:

private IEmailService _emailService;
public UsersController()
{
    _emailService = new Postal.EmailService();
}

public UsersController(Postal.EmailService emailService)
{
    _emailService = emailService;
}

[HttpPost]
public async Task<ActionResult> SendEmail(EmailViewModel viewModel)
{
     dynamic e = new Email("AccountActivation");
     e.ViewData.Add("To", "name@email.com");
     e.ViewData.Add("From", "no-reply@email.com");
     _emailService.Send(e);

     More code...
}
4

2 回答 2

0

我觉得你的怀疑是对的。HttpContext在应用程序初始化期间不可用。因此 Postal 在事件中将不起作用(因为它依赖于ControllerContextand ViewContextApplication_Start

由于您使用的是 DI,因此这也扩展到使用 Unity 配置的每个类的构造函数 - 您不能在构造函数中使用 Postal,但可以在Application_Start完成后调用的方法中使用。

在这种情况下,您需要将对 Postal 的调用移至外部Application_Start或使用本机 .NET 邮件库(因为它们依赖于 System.Net 并且不依赖于 .NET HttpContext)。

于 2015-02-05T20:02:44.177 回答
0

很抱歉回答我自己的问题,但我终于能够得到这个工作。

一旦我async从方法中删除,一切都开始按预期工作。

所以通过改变...

public async Task<ActionResult> SendEmail(EmailViewModel viewModel)

对此...

public ActionResult SendEmail(EmailViewModel viewModel)

然后我能够发送电子邮件而不会触发内部异常Unity.Mvc4.UnityDependencyResolver.get_ChildContainer()

我不知道为什么我不能.Send()从一个async方法中调用 Postal 的(旁注,我试图.SendAsync()用同样的 Unity 问题调用)。如果有人可以阐明为什么这会在一种async方法中起作用,那将不胜感激。

谢谢。

于 2015-02-08T17:03:39.140 回答