我正在开展一个项目,我正试图从一种持久性模式转移到另一种模式。
我查看了企业应用程序架构模式,设计模式,并在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()方法,但它可能是我最终需要做的。
答案 0 :(得分:1)
您计划拥有多少IContactInfo
种不同的衍生物?
也许我错过了这一点,但我认为你会更好地使用ContactInfo
类,每个BillTo
都有ShipTo
和Customer
个实例。由于您的IShippingContactInfo
和IBillingContactInfo
接口继承自相同的IContactInfo
接口,因此您的Customer
类将满足具有一组字段的IContactInfo
个基接口。那将是一个问题。
最好制作那些单独的实例。然后,保存Customer
更为直截了当。
您是否计划进行持久化或保存到数据库或其他内容的序列化?
对Customer和ContactInfo使用具体类型肯定会覆盖前两个。
(平面文件适用于您的原始设置,但我希望您不打算这样做。)
我认为这一切都取决于你期望拥有多少IContactInfo衍生物。图表中的地形更加严重,没有任何问题。如果这意味着一个记录包含多个部分(您的示例),或者这是一对多关系(我的示例),或者它是多对多列出类型(ShipTo,BillTo等)。 )在连接表中。多对多确实减少了Customer与各种ContactInfo类型之间的关系,但是当您需要具体的关系时,它会为场景的应用程序开发带来开销。 击>
答案 1 :(得分:0)
只需让Save()
实现IContactInfo
接口即可轻松地向继承的接口添加IPersistable
方法约束,该接口强制使用Save()
方法。那么IContactInfo
的任何内容也都有IPersistable
,因此必须有Save()
。您也可以使用ILoadable
和Load(int ID)
执行此操作,或者使用更加语义正确的IRetrievable
和Retrieve(int ID)
。
这完全取决于您如何使用ContactInfo
个对象。如果这对您的使用没有意义,请发表评论/更新您的问题,我会重温我的答案。