c# - 在签名相关但不相同的接口(interface)之间进行转换是否是一种反模式?

标签 c# software-design

首先,我对抽象编程的概念很陌生。

假设我有以下内容:

public interface IEmail {}

public interface IEmailWithAttachments : IEmail
{
    List<Attachment> Attachments {get; set;}
}

public interface IService
{
    void Send(IEmail email);
}

EmailService 类发送 IEmail 类型的通知,为此,它使用只能发送 MailMessage 类型对象的 SmtpClient,这就是为什么我使用工厂返回 MailMessage 实例,该实例仅包含传递的 IEmail 对象的属性值。

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 是不同的类型,工厂方法是否应该检查传递的 IEmailWithAttachment 类型的 IEmail 对象,以便我可以访问附件列表属性?如下:

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;
    }
}

或者我应该创建另一个处理 IEmailWithAttachments 类型的工厂方法吗?

提前致谢

最佳答案

就我个人而言,我不认为 IEmailWithAttachments 是与 IEmail 不同的接口(interface),因为对于具有零附件的电子邮件来说是有效的。如果将这两个接口(interface)结合起来,那么希望避免强制转换的设计问题就不再是问题了。

关于c# - 在签名相关但不相同的接口(interface)之间进行转换是否是一种反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57524028/

相关文章:

c# - asp.net c# 中的 SQL 错误

c#.net 错误 : There is already an open DataReader associated with this Command which must be closed first

c# - 根据环境使用具有不同存储帐户的 Azure Functions

c# - 带命令的 Crystal 报表未显示所有字段

c# - DDD : guidance on updating multiple properties of entities

software-design - 自动刷新移动应用程序的高效设计

c# - 如何为正则表达式指定可选字符?

Java软件工程: Composition vs Aggregation

oop - 为什么观察者设计模式通常被描绘成一对多?