业务:
我有一个支付系统,可以通过 GiftCoupon、ClubMembershipCard 等进行支付。一个支付本身可以有多个支付组件
类:
我有一个付款课程。它具有GiftCouponPayment、ClubMembershipCardPayment、CashPayment等支付组件。每个组件类型都满足一个公共接口 IPaymentComponent。我已经使用有关现有类型的知识来实现它。
问题
1)如何以抽象的方式实现这个功能——不知道所有存在的类型是什么?这意味着它需要适用于所有实现 IPaymentComponent 接口的类型。
2)如果无法在LINQ to SQL中实现,是否可以在实体框架中实现?
3) LINQ to SQL在 Payment 对象中生成 GiftCouponPayment 实体时是关联/聚合还是组合?
注意:我使用 LINQ to SQL 作为 ORM。GiftCouponPayment 和 Payment 是自动生成的类,这些对象由 ORM 创建。我通过使用部分类为这些类添加了更多功能。
注意:在数据库中,每个 PaymentComponent(例如 GiftCouponPayment)都有自己的属性(例如 CouponValue、CardValue 等)。因此Table-Per-Hierarchy 不会很好。我们需要单独的表格。该行有解决方案吗?
注意:在此付款之前,GiftCouponPayment 已存在于数据库中。我们需要使用客户提供的 GiftCouponPaymentID 来识别 GiftCouponPayment 对象。我们只需要更新此表中的 PaymentID 列。
泄漏抽象是指任何已实现的抽象,旨在降低(或隐藏)复杂性,其中底层细节并未完全隐藏
LINQ to SQL 图
参考:
- 实体框架 4,继承与扩展?
- 如何选择继承策略http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx
- Fluent API 示例 - http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx
C# 代码
public interface IPaymentComponent
{
int MyID { get; set; }
int MyValue { get; set; }
int GetEffectiveValue();
}
public partial class GiftCouponPayment : IPaymentComponent
{
public int MyID
{
get
{
return this.GiftCouponPaymentID;
}
set
{
this.GiftCouponPaymentID = value;
}
}
public int MyValue
{
get
{
return this.CouponValue;
}
set
{
this.CouponValue = value;
}
}
public int GetEffectiveValue()
{
if (this.CouponNumber < 2000)
{
return 0;
}
return this.CouponValue;
}
}
public partial class Payment
{
public List<IPaymentComponent> AllPaymentComponents()
{
List<IPaymentComponent> allPayComps = new List<IPaymentComponent>();
List<GiftCouponPayment> giftCouponPaymentList = new List<GiftCouponPayment>();
List<CashPayment> cashPaymentList = new List<CashPayment>();
foreach (GiftCouponPayment g in this.GiftCouponPayments)
{
giftCouponPaymentList.Add(g);
allPayComps.Add(g);
}
foreach (CashPayment c in this.CashPayments)
{
cashPaymentList.Add(c);
allPayComps.Add(c);
}
return allPayComps;
}
}