我想创建与数据阅读器类类似的行为,但要创建一个定制的电子邮件程序,以便我可以执行以下操作
Dim sender As New EmailSender(emailTemplate)
While sender.Send()
Response.Write(sender("HTMLContent"))
End While
是否有建议的接口或 mustInherit 类来利用步进功能,以便 sender.Send() 命令准备下一封要发送的电子邮件,如果存在则返回 true?
否 - 您所要做的就是实现 Send() 方法来准备下一封要发送的电子邮件,如果存在则返回 true
您可能正在考虑用于迭代器的 IEnumerable 接口,但您不需要它来满足您的需求
这是我的解决方案,我使用了自己的接口和电子邮件发件人的基类,然后为具体类提供了一些伪代码。
Namespace Emailer
Public Interface IBatchableEmailSender
Function SendNextEmail() As Boolean
Sub PrepareBatchEmail()
Property EmailOutput() As EmailOutput
End Interface
Public MustInherit Class BaseBatchEmailSender
Implements IBatchableEmailSender
Private _emailOutput As EmailOutput
Public Property EmailOutput() As EmailOutput Implements IBatchableEmailSender.EmailOutput
Get
Return _emailOutput
End Get
Set(ByVal value As EmailOutput)
_emailOutput = value
End Set
End Property
Public MustOverride Sub PrepareBatchEmail() Implements IBatchableEmailSender.PrepareBatchEmail
Public MustOverride Function SendNextEmail() As Boolean Implements IBatchableEmailSender.SendNextEmail
Public Sub New()
PrepareBatchEmail()
End Sub
End Class
Public Class BatchCustomerEmail
Inherits BaseBatchEmailSender
Private EmailItems As New Generic.List(Of EmailItem)
Private EmailItemNumber As Integer
Private NextEmailItem As EmailItem
Protected Class EmailItem
Public MemberID As Integer
Public Sub New(ByVal memberID As Integer)
Me.MemberID = memberID
End Sub
End Class
Public Overrides Function SendNextEmail() As Boolean
Dim hasEmail As Boolean = EmailItemNumber < EmailItems.Count
If hasEmail Then
' Run script to send email
' If necessary mark email as sent in the database
EmailItemNumber = EmailItemNumber + 1
End If
Return hasEmail
End Function
Public Overrides Sub PrepareBatchEmail()
'
' Creates a Generic.List(of EmailItems) to email.
'
EmailItemNumber = 0
End Sub
End Class
Public Class EmailOutput
Private _text As String
Public Property Text() As String
Get
Return _text
End Get
Set(ByVal value As String)
_text = value
End Set
End Property
Private _html As String
Public Property HTML() As String
Get
Return _html
End Get
Set(ByVal value As String)
_html = value
End Set
End Property
Private _error As String
Public Property ErrorMessage() As String
Get
Return _error
End Get
Set(ByVal value As String)
_error = value
End Set
End Property
Public Sub New(ByVal errorMesage As String, ByVal html As String, ByVal text As String)
Me.ErrorMessage = errorMesage
Me.HTML = html
Me.Text = text
End Sub
End Class
End Namespace