首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC Postal Emailer与Mvc.Unity4冲突

MVC Postal Emailer与Mvc.Unity4冲突
EN

Stack Overflow用户
提问于 2015-02-06 03:15:09
回答 2查看 304关注 0票数 1

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

我认为这个问题是由于无法访问HttpContext而引发的。

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

代码语言:javascript
复制
dynamic e = new Email("AccountActivation");
e.To = "name@email.com"
e.Send();

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

代码语言:javascript
复制
[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中注册正确的Postal类型。统一容器的初始化在Bootstrapper.cs中进行:

代码语言:javascript
复制
container.RegisterType<UsersController>(new InjectionConstructor());
container.RegisterInstance<IEmailService>(new EmailService());

在我的控制器中,我有:

代码语言:javascript
复制
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...
}
EN

回答 2

Stack Overflow用户

发布于 2015-02-06 04:02:44

我认为你的怀疑是对的。HttpContext在应用程序初始化期间不可用。因此,Postal不会在Application_Start事件中工作(因为它依赖于ControllerContextViewContext)。

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

在这种情况下,您需要将对Postal的调用移到Application_Start之外,或者使用原生.NET邮件库(因为它们依赖于System.Net,而不依赖于HttpContext)。

票数 0
EN

Stack Overflow用户

发布于 2015-02-09 01:03:39

很抱歉回答我自己的问题,但我终于能够让它工作了。

一旦我从方法中删除了async,一切都开始正常工作。

通过改变..。

代码语言:javascript
复制
public async Task<ActionResult> SendEmail(EmailViewModel viewModel)

对这个..。

代码语言:javascript
复制
public ActionResult SendEmail(EmailViewModel viewModel)

然后我就可以在不触发Unity.Mvc4.UnityDependencyResolver.get_ChildContainer()内部异常的情况下发送电子邮件了。

我不确定为什么我不能从async方法中调用Postal的.Send() (顺便说一下,我尝试调用.SendAsync()时也出现了相同的Unity问题)。如果有人能解释为什么这可以在async方法中工作,我们将不胜感激。

谢谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28352164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档