0

我正在从事一个项目,我正在努力尝试从一种持久性模式转移到另一种持久性模式。

我查看了Patterns of Enterprise Application ArchitectureDesign Patterns,并在MSDN 文章中寻求帮助。我们当前的模式是 MSDN 文章中描述的 Active Record 模式。作为向更加模块化的代码库迈出的第一步,我们试图将我们的一些业务对象(又名表)分解为多个接口。

例如,假设我有一个类似这样的商店应用程序:

public interface IContactInfo
{
    ...
}

public interface IBillingContactInfo: IContactInfo
{
    ...
}

public interface IShippingContactInfo: IContactInfo
{
    ...

}

public class Customer: IBillingContactInfo, IShippingContactInfo
{
    #region IBillingContactInfo Implementation
    ...
    #endregion

    #region IShippingContactInfo Implementation
    ...
    #endregion

    public void Load(int customerID);
    public void Save();
}

Customer 类代表我们的客户表中的一行。尽管 Customer 类是一行,但它实际上实现了两个不同的接口:IBillingContactInfo、IShippingContactInfo。

从历史上看,我们没有这两个接口,我们只是在各处传递整个 Customer 对象并对其进行任何我们想要的更改,然后保存它。

这就是问题所在。现在我们有了这两个接口,我们可能有一个控件,它接受一个 IContactInfo,将其显示给用户,并允许用户在错误时更正它。目前,我们的 IContactInfo 接口没有实现任何 Save() 来允许对其进行的更改保持不变。

在不完全切换到其他众所周知的解决方案的情况下,有什么好的设计模式可以绕过这个限制吗?我真的不想通过并为我的所有接口添加一个 Save() 方法,但这可能是我最终需要做的。

4

2 回答 2

1

IContactInfo您计划拥有多少种不同的衍生产品?

也许我错过了重点,但我认为你会更好地使用一个在 each 中调用ContactInfoaBillTo和一个ShipTo实例的类Customer。由于您的IShippingContactInfoIBillingContactInfo接口继承自同一个IContactInfo接口,因此您的类将通过一组字段Customer满足两个基接口。IContactInfo那将是一个问题。

最好制作这些单独的实例。然后,保存你Customer的就更直接了。

您是否计划序列化以实现持久性或保存到数据库或其他东西?

对 Customer 和 ContactInfo 使用具体类型肯定会涵盖前两个。

(平面文件适用于您的原始设置,但我希望您不打算这样做。)

我认为这一切都取决于您期望拥有多少 IContactInfo 的衍生产品。在您的图表中添加更多的地形并没有错。如果这意味着一条记录具有多个部分(您的示例),或者这是一对多关系(我的示例),或者它是列出类型(ShipTo、BillTo 等)的多对多关系。 ) 在连接表中。多对多肯定会减少 Customer 和各种 ContactInfo 类型之间的关系,但是当您需要具体关系时,它会在应用程序开发中产生开销。

于 2012-10-22T21:58:33.670 回答
0

您可以通过简单地实现一个接口来轻松地将Save()方法约束添加到继承的接口,该接口强制执行该方法。那么任何有的也有,因此必须有。您也可以使用and - or 来执行此操作,语义更正确,and 。IContactInfoIPersistableSave()IContactInfoIPersistableSave()ILoadableLoad(int ID)IRetrievableRetrieve(int ID)

这完全取决于您如何使用您的ContactInfo对象。如果这对您的使用没有意义,请发表评论/更新您的问题,我将重新审视我的答案。

于 2012-10-22T21:58:09.017 回答