首先,我是反对抽象编程概念的新手。
假设我有以下内容:
public interface IEmail {}
public interface IEmailWithAttachments : IEmail
{
List<Attachment> Attachments {get; set;}
}
public interface IService
{
void Send(IEmail email);
}
EmailService类发送IEmail类型的通知,为此它使用SmtpClient,该通知只能发送MailMessage类型的对象,这就是为什么我使用工厂返回仅包含传递的IEmail对象的属性值的MailMessage实例的原因。
public class EmailService : IService
{
private IMailMessageFactory _mailMessageFactory;
private ISmtpClient _smtpClient;
public EmailService(ISmtpClient smtpClient, IMailMessageFactory mailMessageFactory)
{
_mailMessageFactory = mailMessageFactory;
_smtpClient = smtpClient;
}
public void Send(IEmail email)
{
using(MailMessage mailMessage = _mailMessageFactory.CreateMailMessageFromNotification(email))
{
_smtpClient.Send(mailMessage);
}
}
}
public interface IMailMessageFactory
{
MailMessage CreateMailMessageFromNotification(IEmail email);
}
public class MailMessageFactory : IMailMessageFactory
{
public MailMessage CreateMailMessageFromNotification(IEmail email)
{
MailMessage mailMessage = new MailMessage();
//copies the IEmail properties to the new created MailMessage instance
return mailMessage;
}
}
问题:
据我所知,IEmailWithAttachment是与IEmail不同的类型,工厂方法是否应该检查传递的IEmail对象是否为IEmailWithAttachment类型,以便我可以访问附件列表属性?如下所示:
public class MailMessageFactory : IMailMessageFactory
{
public MailMessage CreateMailMessageFromNotification(IEmail email)
{
MailMessage mailMessage = new MailMessage();
//copies the IEmail properties to the new created MailMessage instance
IEmailWithAttachment emailWithAttachment = email as IEmailWithAttachment;
if (emailWithAttachment != null)
{
foreach (var attachment in emailWithAttachment.Attachments)
{
mailMessage.Attachments.Add(attachment);
}
}
return mailMessage;
}
}
OR 我是否应该创建另一个处理IEmailWithAttachments类型的工厂方法?
预先感谢
答案 0 :(得分:1)
我个人看不到IEmailWithAttachments
是与IEmail
分开的接口,因为对于电子邮件来说,附件的数量为零是有效的。如果将两个接口组合在一起,则希望避免强制转换的设计问题不再是问题。