У меня есть отношение к базе данных, как показано ниже. Объекты домена создаются на основе LINQ to SQL ORM.
Платеж состоит из платежа наличными и платежа подарочным купоном. Предположим, что общая сумма покупки составляет 550. Она может быть оплачена следующими компонентами
1 Gift Coupon Valued 300
1 Gift Coupon Valued 200
I Cash Currency Valued 50
Я вставляю новые платежные записи, используя функцию «InsertOnSubmit» ORM. Следующий код работает нормально. Однако, если компания представляет новый компонент оплаты с помощью кредитной карты, мне нужно внести изменения в класс домена «Платежи». Как сделать класс платежей открытым для расширения и закрытым для изменений с использованием ORM ?
Примечание. :Класс Payment имеет поведение (. Например. GetTotalAmountCollected ). Я пытаюсь сделать класс «Платеж», чтобы удовлетворить OCP.
Примечание. :Существует особое поведение для типа купона. Если дата выдачи купона меньше 01.01.2000, ее нельзя использовать при расчете общей суммы (, т. е. значение купона должно быть равно нулю ). См. также Рефакторинг кода с использованием шаблона стратегии .
Примечание :Я использую .Net 4.0
Ссылка:
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();
}
}