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-aproduct
),然后读取购买的实例以填充签出时的值
现在,客户希望拥有产品“捆绑包”。这些行为在所有方面都与单个“产品”相同,但以下情况除外:
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
的属性不同。因此,我认为继承的一部分是正确的,我应该回到购买的类型并重新构造它们。