在签名相关但不相同的接口之间进行转换是否是一种反模式?
is it an anti-pattern to cast between interfaces that are related but not identical regarding the signatures?
首先,我不熟悉针对抽象进行编程的概念。
假设我有以下内容:
public interface IEmail {}
public interface IEmailWithAttachments : IEmail
{
List<Attachment> Attachments {get; set;}
}
public interface IService
{
void Send(IEmail email);
}
EmailService class 发送 IEmail 类型的通知,为此它使用 SmtpClient,它只能发送 MailMessage 类型的对象,这就是为什么我使用工厂来 return 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;
}
}
OR 我应该创建另一个处理 IEmailWithAttachments 类型的工厂方法吗?
提前致谢
就我个人而言,我看不出 IEmailWithAttachments
是一个独立于 IEmail
的界面,因为它对零附件的电子邮件有效。如果将这两个界面结合起来,那么希望避免转换的设计问题就不再是问题了。
首先,我不熟悉针对抽象进行编程的概念。
假设我有以下内容:
public interface IEmail {}
public interface IEmailWithAttachments : IEmail
{
List<Attachment> Attachments {get; set;}
}
public interface IService
{
void Send(IEmail email);
}
EmailService class 发送 IEmail 类型的通知,为此它使用 SmtpClient,它只能发送 MailMessage 类型的对象,这就是为什么我使用工厂来 return 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;
}
}
OR 我应该创建另一个处理 IEmailWithAttachments 类型的工厂方法吗?
提前致谢
就我个人而言,我看不出 IEmailWithAttachments
是一个独立于 IEmail
的界面,因为它对零附件的电子邮件有效。如果将这两个界面结合起来,那么希望避免转换的设计问题就不再是问题了。