我有一个数据库关系,如下所示。域对象是基于 LINQ to SQL ORM 创建的。
付款包括现金付款和礼券付款。假设购买总金额为550,可按以下几部分支付
1 Gift Coupon Valued 300
1 Gift Coupon Valued 200
I Cash Currency Valued 50
我正在使用 ORM 的“InsertOnSubmit”功能插入新的付款记录。以下代码工作正常。但是,如果我公司正在引入使用信用卡的新支付组件,我需要对我的“支付”域类进行更改。如何使支付类Open for Extension 和 Closed for Changes仍然使用ORM?
注意:Payment 类具有行为(例如 GetTotalAmountCollected)。我正在尝试制作“支付”类来满足 OCP。
注意:优惠券类型有特定的行为。如果 Coupon 发行日期小于 2000 年 1 月 1 日,则不应将其用于计算 Total Amount(即 CouponValue 应为零)。另请参阅使用策略模式重构代码。
注意:我使用的是.Net 4.0
参考:
- 将 ObjectContext.AddObject 与实体框架一起使用时出错
- 使用策略模式重构代码
- 更喜欢组合而不是继承?
- 代码优先与模型/数据库优先
- 使用 Unity 的策略模式和依赖注入
- 委托与 OOP 的 C# 策略设计模式
- 如何在 C# 中使用策略模式?
- 使用 EF 代码优先继承:第 2 部分 - 每个类型的表 (TPT) http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first -ctp5-part-2-table-per-type-tpt.aspx
C#代码:
public class PaymentAppService
{
public RepositoryLayer.ILijosPaymentRepository Repository { get; set; }
public void MakePayment()
{
DBML_Project.Payment paymentEntity = new DBML_Project.Payment();
paymentEntity.PaymentID = 1;
paymentEntity.PaymentType = "PurchaseP";
DBML_Project.CashPayment cashObj = new DBML_Project.CashPayment();
cashObj.CashPaymentID = 1;
cashObj.CurrencyNumber = 123;
cashObj.CurrencyValue = 100;
DBML_Project.GiftCouponPayment giftCouponObj = new DBML_Project.GiftCouponPayment();
giftCouponObj.GiftCouponPaymentID = 1;
giftCouponObj.CouponValue = 200;
giftCouponObj.CouponNumber = 124;
paymentEntity.CashPayments = new System.Data.Linq.EntitySet<DBML_Project.CashPayment>();
paymentEntity.CashPayments.Add(cashObj);
paymentEntity.GiftCouponPayments = new System.Data.Linq.EntitySet<DBML_Project.GiftCouponPayment>();
paymentEntity.GiftCouponPayments.Add(giftCouponObj);
Repository.InsertEntity(paymentEntity);
Repository.SubmitChanges();
}
}
存储库:
public class LijosPaymentRepository : ILijosPaymentRepository
{
public System.Data.Linq.DataContext MyDataContext { get; set; }
public void InsertEntity(DBML_Project.Payment payment)
{
//Insert the entity
MyDataContext.GetTable<DBML_Project.Payment>().InsertOnSubmit(payment);
}
public void SubmitChanges()
{
MyDataContext.SubmitChanges();
}
}