我正在通过“头部优先设计模式”工作,并希望立即在实践中使用它。
我正在编写一段将应用程序与其他应用程序连接起来的代码。事实上,我需要生成一个包含 XML 文件的电子邮件并通过电子邮件发送它。但是将来可能需要其他东西。

因此,我确定了“改变的事情”:
- 传输数据
- 传输方式(可以是电子邮件,但可以是 FTP 或网络服务以进行其他数据交换)

所以我:
- 创建了一个抽象类 DataObject
- 创建了一个接口(interface) ITransmissionMethod
- 创建了一个 dataExchange 抽象类:

  abstract class DataExchange<T,U>
    {
        private T DataObject;
        private U SendMethod;
    }

而 SendViaMail 就像
class SendViaMail : ISendMethod<System.Net.Mail.Attachment>
{
    public override void Send(System.Net.Mail.Attachment dataItem)
    {
        throw new NotImplementedException();
    }
}

现在 - 我可以创建类,如:
class MyExchange : DataExchange<MyDataObject,SendViaMail> { }

您如何看待这种方法?现在我真正想做的是在 DataExchange 中创建一个抽象方法,它应该看起来像
private abstract [the type of the T in ISendMethod<T>] PrepareObjectForSending(T dataObject) {
}

Visual Studio 会强制我实现如下方法:
private abstract System.Net.Mail.Attachment PrepareObjectForSendingMyDataObject dataObject) {
// Serialize XML file and make it into attachment object
}

那不会很甜吗?但是你们如何看待这种方法?将来,人们可以创建新的数据对象和新的发送方法,而代码仍然可以工作。我一直在尝试做的是:针对界面进行编程并提取变化的部分。这个怎么样?

最佳答案

那会奏效,但您可以进一步分离关注点。这只是另一个版本 - 使 DataExchange 非常简单,并将实际工作委托(delegate)给工作人员:

class DataExchange<TDataObject, TTransmissionObject>
{
    IConverter<TDataObject, TTransmissionObject> conterver;
    ISendMethod<TTransmissionObject> sender;

    public Send(TDataObject dataObject)
    {
        TTransmissionObject tro = conterver.Convert(dataObject);
        sender.Send(tro);
    }
}

Converts 只是将数据对象转换为适合传输的对象:
class DataToAttachmentConverter : IConverter<DataObject, Attachment>
{
    Attachment Convert(DataObject) { }
}
class DataToXmlConverter : IConverter<DataObject, XmlDocument>
{
    XmlDocument Convert(DataObject) { }
}

发件人只会发送。
class MailSender : ISendMethod<Attachment>
{
    void Send(Attachment) {}
}
class FtpPublisher : ISendMethod<XmlDocument>
{
    void Send(XmlDocument) {}
}

放在一起:
var exchanges = new [] {
      new DataExchange<DataObject, Attachment>( new DataToAttachmentConverter(), new MailSender()),
      new DataExchange<DataObject, XmlDocument>( new DataToXmlConverter(), new FtpPublisher())
};

foreach(var ex in exchanges)
    ex.Send(dataObject); //send as an attachent and put to ftp site.

关于c# - 关于泛型的架构/最佳实践问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7078758/

10-12 20:31