Zamknięcie klasy jednostek dla zmian

Mam relację z bazą danych, jak pokazano poniżej. Obiekty domeny są tworzone na podstawie LINQ do SQL ORM.

Płatność obejmuje płatności gotówką i kuponem podarunkowym. Załóżmy, że całkowita kwota zakupu wynosi 550. Można ją zapłacić jako następujące składniki

1 Gift Coupon Valued 300

1 Gift Coupon Valued 200

I Cash Currency Valued 50

Wprowadzam nowe rekordy płatności za pomocą funkcji „InsertOnSubmit” ORM. Poniższy kod działa poprawnie. Jeśli jednak firma wprowadza nowy składnik płatności za pomocą karty kredytowej, muszę wprowadzić zmiany w mojej klasie domeny „Płatność”. Jak zrobić klasę płatnościOtwórz dla rozszerzenia i zamknij dla zmian nadal używaORM?

Uwaga: klasa płatności mazachowania (Np. GetTotalAmountCollected). Staram się, aby klasa „Płatność” spełniała wymagania OCP.

Uwaga: istnieje określonyzachowanie dla typu kuponu. Czy data wydania kuponu jest mniejsza niż 1/1/2000, nie należy jej używać do obliczania łącznej kwoty (tj. CouponValue powinna wynosić zero). Odnosić sięKod refaktoryzacji przy użyciu Wzorca strategii również.

Uwaga: używam.Net 4.0

Odniesienie:

Uzyskiwanie błędu podczas używania ObjectContext.AddObject z Entity FrameworkKod refaktoryzacji przy użyciu Wzorca strategiiWolisz kompozycję niż dziedziczenie?Najpierw kod-vs model / baza danychWzorzec strategii i zastrzyk zależności przy użyciu UnityC # Strategia Wzorzec projektowy według Delegata a OOPJak używać wzorca strategii z C #?Dziedziczenie z kodem EF Najpierw: część 2 - tabela na typ (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

Kod 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();
    }
}

Magazyn:

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();
    }
}

questionAnswers(4)

yourAnswerToTheQuestion