C# 4.0 产品、ProductBundle和“的类结构”;购买;它们的版本

C# 4.0 产品、ProductBundle和“的类结构”;购买;它们的版本,c#-4.0,data-structures,C# 4.0,Data Structures,我有一对现有的业务对象类型,Product和PurchasedProduct,后者是前者的子类 前者表示客户购物篮中的一个对象,所有信息(数量除外)都从存储在数据库中的“原型”产品中读取 当客户退房时,购物篮的内容存储在数据库中,ID为其原型,但所有相关的潜在可变采购信息(净价、增值税税率、数量等)“烘焙”到记录中。这样,当客户检查其订单历史记录时,每个订单将创建一个PurchasedProduct对象,该对象将报告at签出值,而不是原型值 因此,在检索购买的产品实例时,可以首先读取原型以填充大

我有一对现有的业务对象类型,
Product
PurchasedProduct
,后者是前者的子类

前者表示客户购物篮中的一个对象,所有信息(数量除外)都从存储在数据库中的“原型”产品中读取

当客户退房时,购物篮的内容存储在数据库中,ID为其原型,但所有相关的潜在可变采购信息(净价、增值税税率、数量等)“烘焙”到记录中。这样,当客户检查其订单历史记录时,每个订单将创建一个PurchasedProduct对象,该对象将报告at签出值,而不是原型值

因此,在检索购买的产品实例时,可以首先读取原型以填充大部分数据(因为
PurchasedProduct
is-a
product
),然后读取购买的实例以填充签出时的值

现在,客户希望拥有产品“捆绑包”。这些行为在所有方面都与单个“产品”相同,但以下情况除外:

1) 捆绑包包含
产品的列表
对象(数量固定),但其价格与包含的产品、数量等无关。 2) 购买时,它不仅需要记录自己的结账时间、价格等,还需要记录其组成产品的价格

我最初的想法是:

ProductBundle : Product
{
    public List<Product> Products { get; set; }
    // other stuff as needed
}

PurchasedProductBundle : PurchasedProduct
{
    public List<PurchasedProduct> Products { get; set; }
    // other stuff as needed
}
ProductBundle:Product
{
公共列表产品{get;set;}
//其他需要的东西
}
PurchasedProductBundle:PurchasedProduct
{
公共列表产品{get;set;}
//其他需要的东西
}
这似乎增加了
ProductRepository
的复杂性,后者的职责主要是将产品ID转换为业务对象。它需要检查传入的数据,并为这四种类型中的每种类型在多个路径之间切换,其中一些路径具有重复的功能。它似乎还复制了子产品属性列表。最后,
PurchasedProductBundle
既是
ProductBundle
又是
PurchasedProduct
,但C当然没有多重继承

另一种方法可能是组合,因此
ProductBundle
是单个
产品
产品
列表的组合,但通过底层
产品
传递属性访问似乎有很多样板


这两条路径是否都是一条合理的路径,或者是不是有一条非常清晰的模式我错过了?

< P>一种可能是考虑<代码> PurchasedProduct <代码>不是“源自代码<产品<代码> >。而是具有
ipproduct
界面,该界面可以是
PurchasedProduct
Product
。 您的产品包将是
ipProductBundle
(它们是
ipProduct
),并为
PurchasedProductBundle
ProductBundle
提供
IEnumerable产品{get;set;}

这背后的原因是
购买的产品
不是
产品
,与其说它是
产品
,不如说它是一种购买或订单,而且许多原因可能会影响价格的变化,不仅是价格会随着时间的推移而变化,还可能有商业报价、优惠券


另一种可能是考虑到你根本不在乎捆绑在一起的产品的价格是多少?毕竟,您可能会在全球范围内宣传折扣百分比,但这是另一个问题。

谢谢!我喜欢
IProduct
IProductBundle
的建议和关于
PurchasedProduct
不是真正的
产品
,但是
产品
ProductBundle
之间有很多共享功能,只有基于
IEnumerable
的属性不同。因此,我认为继承的一部分是正确的,我应该回到购买的
类型并重新构造它们。