Haciendo la clase de entidad cerrada por cambios

Tengo una relación de base de datos como se muestra a continuación. Los objetos de dominio se crean en base a LINQ to SQL ORM.

Un pago incluye pagos en efectivo y cupones de regalo. Supongamos que el monto total de la compra es 550. Se puede pagar como los siguientes componentes

1 Gift Coupon Valued 300

1 Gift Coupon Valued 200

I Cash Currency Valued 50

Estoy insertando nuevos registros de pago utilizando la función "InsertOnSubmit" de ORM. El siguiente código está funcionando bien. Sin embargo, si la compañía está introduciendo un nuevo componente de pago con tarjeta de crédito, debo realizar cambios en mi clase de dominio "Pago". ¿Cómo hago la clase de pago?Abierto para extensión y cerrado para cambios sigue usandoORM?

Nota: La clase de pago tienecomportamientos (Por ejemplo, GetTotalAmountCollected). Estoy tratando de hacer la clase "Pago" para satisfacer a OCP.

Nota: hay una específicacomportamiento para el tipo de cupón. Si la fecha de emisión del cupón es menor que 1/1/2000, no debe usarse en el cálculo de la cantidad total (es decir, el valor de cupón debe ser cero). ReferirCódigo de refactorización utilizando patrón de estrategia. además.

Nota: estoy usando.Net 4.0

Referencia:

Obtención de un error al utilizar ObjectContext.AddObject con Entity FrameworkCódigo de refactorización utilizando patrón de estrategia.¿Prefieres la composición sobre la herencia?Code-first vs Model / Database-firstPatrón de estrategia e inyección de dependencia utilizando la unidadC # Patrón de diseño de estrategia por delegado vs OOP¿Cómo utilizar el patrón de estrategia con C #?Herencia con el código EF primero: Parte 2 - Tabla por tipo (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ódigo 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();
    }
}

Repositorio:

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

Respuestas a la pregunta(4)

Su respuesta a la pregunta