持久性的设计模式

时间:2012-10-22 21:25:19

标签: c# design-patterns

我正在开展一个项目,我正试图从一种持久性模式转移到另一种模式。

我查看了企业应用程序架构模式设计模式,并在this 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()方法,但它可能是我最终需要做的。

2 个答案:

答案 0 :(得分:1)

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

也许我错过了这一点,但我认为你会更好地使用ContactInfo类,每个BillTo都有ShipToCustomer个实例。由于您的IShippingContactInfoIBillingContactInfo接口继承自相同的IContactInfo接口,因此您的Customer类将满足具有一组字段的IContactInfo个基接口。那将是一个问题。

最好制作那些单独的实例。然后,保存Customer更为直截了当。

您是否计划进行持久化或保存到数据库或其他内容的序列化?

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

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

我认为这一切都取决于你期望拥有多少IContactInfo衍生物。图表中的地形更加严重,没有任何问题。如果这意味着一个记录包含多个部分(您的示例),或者这是一对多关系(我的示例),或者它是多对多列出类型(ShipTo,BillTo等)。 )在连接表中。多对多确实减少了Customer与各种ContactInfo类型之间的关系,但是当您需要具体的关系时,它会为场景的应用程序开发带来开销。

答案 1 :(得分:0)

只需让Save()实现IContactInfo接口即可轻松地向继承的接口添加IPersistable方法约束,该接口强制使用Save()方法。那么IContactInfo的任何内容也都有IPersistable,因此必须有Save()。您也可以使用ILoadableLoad(int ID)执行此操作,或者使用更加语义正确的IRetrievableRetrieve(int ID)

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