Закрытие класса сущностей для изменений

У меня есть отношение к базе данных, как показано ниже. Объекты домена создаются на основе LINQ to SQL ORM.

Платеж состоит из платежа наличными и платежа подарочным купоном. Предположим, что общая сумма покупки составляет 550. Она может быть оплачена следующими компонентами

1 Gift Coupon Valued 300

1 Gift Coupon Valued 200

I Cash Currency Valued 50

enter image description here

Я вставляю новые платежные записи, используя функцию «InsertOnSubmit» ORM. Следующий код работает нормально. Однако, если компания представляет новый компонент оплаты с помощью кредитной карты, мне нужно внести изменения в класс домена «Платежи». Как сделать класс платежей открытым для расширения и закрытым для изменений с использованием ORM ?

Примечание. :Класс Payment имеет поведение (. Например. GetTotalAmountCollected ). Я пытаюсь сделать класс «Платеж», чтобы удовлетворить OCP.

Примечание. :Существует особое поведение для типа купона. Если дата выдачи купона меньше 01.01.2000, ее нельзя использовать при расчете общей суммы (, т. е. значение купона должно быть равно нулю ). См. также Рефакторинг кода с использованием шаблона стратегии .

Примечание :Я использую .Net 4.0

Ссылка:

  1. Получение ошибки при использовании ObjectContext.AddObject с Entity Framework
  2. Рефакторинг кода с использованием шаблона стратегии
  3. Предпочитаете композицию наследованию?
  4. Код -первый против модели/базы данных -первый
  5. Шаблон стратегии и внедрение зависимостей с использованием Unity
  6. C #Шаблон проектирования стратегии от делегата против ООП
  7. Как использовать шаблон стратегии с C #?
  8. Наследование с помощью EF Code First :Часть 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();
    }
}
7
задан 20 revs, 2 users 92% 23 May 2017 в 11:46
поделиться