电邮提供商设计

时间:2011-09-23 18:11:33

标签: c# oop

我在考虑使用提供者模式创建电子邮件提供商。我们的电子邮件系统处于混乱状态。我们在同一个应用程序中有不同的区域以及使用他们自己的电子邮件处理方式的不同应用程序。我想创建一个电子邮件提供商,因为全面的信息大致相同。通过使用提供者模式,我可以使用我们的默认处理电子邮件的方式,但也可以通过使用接口来引入更具体/自定义的电子邮件处理。

所以我不太确定如何设置界面来处理每个区域特定/自定义处理并寻找一些指导。我希望我的抽象类能够提供默认设置/功能,然后让我的电子邮件提供商执行调用sproc来发送电子邮件。

现在不确定我将如何引入一个新界面,以便如果另一个开发人员需要进行一些与他正在进行的工作相关的定制,他可以扩展提供者来处理他的更改。关于这种方法的任何想法或可能建议其他方法?如果您喜欢提供者方法并且知道如何实现我建议的一些伪代码会很好。 :)

public Interface IEmail   

abstract class EmailProviderBase : ProviderBase, IEmail

   //Default settings and methods
   public virtual SendEmail(){}


//Used to handle default implementation
public class EmailProvider : EmailProviderBase

//But want other classes to be used to handle other devs custom implementations
//I guess I could create another provider per say based on EmailProviderBase.
public class CustomEmail : EmailProviderBase

有人能告诉我他们是否喜欢这种方法?如果没有,你会如何使用接口设计它?

谢谢, DND

2 个答案:

答案 0 :(得分:2)

这可能只是我,但在我看来,System.Net.Mail类已经很好地抽象了细节,并在可定制性和易用性之间取得了良好的平衡。如果您尝试简化更多内容,则无法在需要时自定义。

我们开始通过电子邮件沿着这条道路做点什么,当我们做了更多的项目,并且我们的需求发生了变化时,我们最终不得不自定义我们的课程,以至于显然整个练习都是浪费时间。

但是,我知道你来自哪里,这是另一种统一你如何从你的应用程序发送电子邮件的可能性。这不是你要求的,而是作为一种可能的不同方式呈现根据对我们团队有用的内容来解决问题。

我们所确定的是SOLELY基于我们最大的痛点,即我们的管理员每隔几年就会更换一次Exchange服务器,或者他们会因某种原因更改IP地址。每次发生这种情况时,我们都必须重新编译一堆代码,这非常令人沮丧。

我们最终设置了具有电子邮件功能的Web服务。现在,我们内部应用程序中的所有电子邮件都使用Web服务。当我们的管理员在服务器上更改某些内容时,我们只需要调整我们的Web服务中的.config文件,而不必在每个发送电子邮件的应用程序中重新编译或编辑.config。

这对我们来说特别有用,因为我们能够将错误处理集成到我们的中央错误记录数据库中,因此我们所有的应用程序都只有几行代码来发送电子邮件。错误处理包括在内。

自我们实施此功能以来,我们必须进行的唯一调整是让Web服务通过PickupDirectory发送电子邮件,而不是直接与Exchange服务器通信。这允许服务在Exchange服务器关闭时工作(维护,重新启动以应用修补程序等)

Web服务中的代码也相当简单,并使用Microsoft.Security.AntiXss组件处理卫生。

代码中对监督系统的引用是对我们的中央错误记录数据库的引用。我不会包含那些代码,因为这已经是一个太长的答案了,而它真正做的就是将错误记录到SQL数据库中。

很抱歉,你在VB中指定了C#,但是如果你感兴趣的话,它应该很容易转换。

<WebMethod()> _
 Public Function SendEmailViaPickupDir(ByVal FromAddress As String, ByVal ToList As String, ByVal CcList As String, ByVal BccList As String, _
                    ByVal Subject As String, ByVal MessageBody As String, ByVal IsBodyHtml As Boolean) As Boolean

    Dim msg As System.Net.Mail.MailMessage = BuildMessage(FromAddress, ToList, CcList, BccList, Subject, MessageBody, IsBodyHtml)

    If Not msg Is Nothing Then
        Return SendMessageViaPickupDir(msg)
    Else
        Return False
    End If

End Function

Private Function BuildMessage(ByVal FromAddress As String, ByVal ToList As String, ByVal CcList As String, ByVal BccList As String, _
     ByVal Subject As String, ByVal MessageBody As String, ByVal IsBodyHtml As Boolean) As System.Net.Mail.MailMessage

    Dim msg As New System.Net.Mail.MailMessage

    Try
        msg.From = New System.Net.Mail.MailAddress(FromAddress)

        If Not ToList Is Nothing Then
            For Each Address As String In ToList.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                msg.To.Add(New System.Net.Mail.MailAddress(Address.Trim()))
            Next
        End If

        If Not CcList Is Nothing Then
            For Each Address As String In CcList.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                msg.CC.Add(New System.Net.Mail.MailAddress(Address.Trim()))
            Next

        End If
        If Not BccList Is Nothing Then
            For Each Address As String In BccList.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                msg.Bcc.Add(New System.Net.Mail.MailAddress(Address.Trim()))
            Next

        End If

        msg.Subject = Microsoft.Security.Application.AntiXss.HtmlEncode(Subject)
        If (IsBodyHtml) Then
            msg.Body = Microsoft.Security.Application.AntiXss.GetSafeHtmlFragment(MessageBody)
        Else
            ' This was causing formatting issues...
            msg.Body = MessageBody
        End If
        msg.IsBodyHtml = IsBodyHtml

    Catch ex As Exception
        Dim s As New OverseerService
    s.WriteToSql(Convert.ToInt64(ConfigurationManager.AppSettings("OverseerWebSiteResourceid")), User.Identity.Name, _
     My.Computer.Name, ex.ToString(), MyCompany.Overseer.EventLogger.SeverityLevel.Critical)
        Return Nothing
    End Try

    Return msg

End Function

Private Function SendMessageViaPickupDir(ByVal msg As System.Net.Mail.MailMessage) As Boolean
    Dim ret As Boolean = False

    Try
        ' try to send through pickup dir
        Dim c1 As New System.Net.Mail.SmtpClient("localhost")
        c1.DeliveryMethod = Net.Mail.SmtpDeliveryMethod.PickupDirectoryFromIis
        c1.Send(msg)
        ret = True

    Catch ex As Exception
        Try
            ' log as a known error
            Dim s As New OverseerService
            s.WriteToSql(Convert.ToInt64(ConfigurationManager.AppSettings("OverseerWebSiteResourceid")), User.Identity.Name, _
             My.Computer.Name, "failed to write email to pickup dir " + ex.ToString(), MyCompany.Overseer.EventLogger.SeverityLevel.KnownError)
        Catch
            ' ignore error from writing the error
        End Try
    End Try

    Return ret

End Function

答案 1 :(得分:1)

你签出了http://mailsystem.codeplex.com/吗?这可能是codeplex上最精细的OSS电子邮件实用程序。在codeplex上有一个更简单的产品,更类似于你上面描述的内容,但我现在没有任何运气。