我有如下所示数据库的关系。 基于LINQ to SQL的ORM正在创建的域对象。
的支付包括现金支付和礼券付款的。 假设购买总额为550可以缴纳下列组件
1 Gift Coupon Valued 300
1 Gift Coupon Valued 200
I Cash Currency Valued 50
我将使用ORM的“InsertOnSubmit”功能的新的缴费记录。 下面的代码是工作的罚款。 但是,如果我公司使用的信用卡引入一个新的支付组件,我需要改变我的“支付”领域类。 我如何支付类对扩展开放和关闭的变化仍然使用ORM?
注:支付类有行为 (例如GetTotalAmountCollected)。 我试图使“支付”类,以满足OCP。
注:对于优惠券类型的特定行为 。 签发日期优惠券小于1/1/2000,它不应该在计算的总金额(即COUPONVALUE应该是零)使用。 请参阅使用策略模式重构的代码也。
注:我使用.NET 4.0
参考:
- 使用ObjectContext.AddObject与实体框架时,遇到了一个错误
- 使用策略模式重构代码
- 身高超过组成继承?
- 代码优先和模型/数据库一
- 策略模式和依赖注入使用Unity
- C#Strategy设计模式的代表VS OOP
- 如何使用C#的战略格局?
- 继承与EF代码第一:第2部分-每个类型表(TPT) http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first -ctp5部分-2-表每类型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();
}
}