Создание класса сущностей закрытым для изменений
У меня есть связь с базой данных, как показано ниже. Доменные объекты создаются на основе LINQ to SQL ORM.
Платеж состоит из наличных и подарочных купонов. Предположим, что общая сумма покупки составляет 550. Это может быть оплачено как следующие компоненты
1 Gift Coupon Valued 300
1 Gift Coupon Valued 200
I Cash Currency Valued 50
Я вставляю новые записи о платежах, используя & # x201C; InsertOnSubmit & # x201D; функция ОРМ. Следующий код работает нормально. Однако, если компания вводит новый платежный компонент с помощью кредитной карты, мне нужно внести изменения в мой & # x201C; Payment & # x201D; Доменный класс. Как мне сделать класс оплатыOpen for Extension and Closed for Changes все еще используюORM?
Примечание: класс оплаты имеетbehaviors (Например, GetTotalAmountCollected). Я пытаюсь сделать "Платеж" класс, чтобы удовлетворить OCP.
Примечание: есть конкретныйbehavior для типа купона. Если дата выдачи купона меньше 1/1/2000, ее не следует использовать при расчете общей суммы (т. Е. CouponValue должен быть равен нулю). обращатьсяРефакторинг кода с использованием шаблона стратегии также.
Примечание: я использую.Net 4.0
Ссылка:
Getting an error when using ObjectContext.AddObject with Entity Framework Refactoring code using Strategy Pattern Prefer composition over inheritance? Code-first vs Model/Database-first Strategy Pattern and Dependency Injection using Unity C# Strategy Design Pattern by Delegate vs OOP How to use the Strategy Pattern with C#? Inheritance with EF Code First: Part 2 – Table per Type (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();
}
}
Repository:
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();
}
}