2011-11-18 70 views
1

我使用优秀的MvcMailer包在我的应用程序内发送电子邮件。 我使用SendAsync()方法来发送电子邮件,并希望记录错误+处置的附件,即使用MvcMailer发送异步邮件时记录错误

MailMessage message = UserMailer.SendSomeEmail(emailViewModel); 

     var client = new SmtpClientWrapper(); 
     client.SendCompleted += (sender, e) => 
     { 
      if (e.Error != null || e.Cancelled) 
      { 
       Logger.LogError(e.Error); 
      } 
      if (message != null) 
      { 
       message.Attachments.Dispose(); 
       message.Dispose(); 
      } 
      client.Dispose(); 
     }; 
     message.SendAsync("this means nothing afaik", client); 

这个伟大的工程,但它太痛苦超过wherver都重复同样的代码片段我需要发送电子邮件。

我应该如何设置它,以便在异步调用完成时记录任何错误并处理消息附件?一定有更好的方法!

回答

0

如果您要做的是避免每次发送异步电子邮件时都要编写日志记录和清理代码,答案很简单 - 停止使用匿名方法。只要看看当前的代码,并把它放在一个普通的方法是这样的:

public void AsyncSendCompleted(object sender, EventArgs e) 
{ 
    // Use an appropriate type instead of EventArgs so you can get 
    // stuff like e.Cancelled and e.Error 

    // The rest of your code goes here 
} 

现在使用此方法作为事件处理程序为您SendCompleted事件:

client.SendCompleted += AsyncSendCompleted; 
+0

谢谢!我正在尝试处理MailMessage对象+以DRY方式添加事件处理程序,但是我想如果不修改MvcMailer源代码本身,这是不可能的。 – seekay

+0

你应该使用'使用'块来照顾处置。如果你真的需要重复添加事件处理程序,你可以看看使用工厂模式。只需连接工厂内您需要的任何东西。 – Ragesh