在签名相关但不相同的接口之间强制转换是否是反模式?

时间:2019-08-16 11:42:21

标签: c# software-design

首先,我是反对抽象编程概念的新手。

假设我有以下内容:

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类型的工厂方法?

预先感谢

1 个答案:

答案 0 :(得分:1)

我个人看不到IEmailWithAttachments是与IEmail分开的接口,因为对于电子邮件来说,附件的数量为零是有效的。如果将两个接口组合在一起,则希望避免强制转换的设计问题不再是问题。

相关问题