Tornando a classe de entidade fechada para alterações

Eu tenho uma relação de banco de dados, como mostrado abaixo. Os objetos de domínio são criados com base no LINQ to SQL ORM.

Um pagamento inclui pagamentos em dinheiro e cupons de presente. Suponha que o valor total da compra seja 550. Ele pode ser pago conforme os seguintes componentes

1 Gift Coupon Valued 300

1 Gift Coupon Valued 200

I Cash Currency Valued 50

Estou inserindo novos registros de pagamento usando a função “InsertOnSubmit” do ORM. O código a seguir está funcionando bem. No entanto, se a empresa estiver introduzindo um novo componente de pagamento usando cartão de crédito, preciso fazer alterações em minha classe de domínio "Pagamento". Como eu faço a classe de pagamento?Aberto para extensão e fechado para alterações ainda usandoORM?

Nota: a classe Payment temcomportamentos (Por exemplo, GetTotalAmountCollected). Estou tentando fazer com que a classe "Payment" satisfaça o OCP.

Nota: Existe um específicocomportamento para o tipo de cupom. A data de emissão do cupom é menor que 1/1/2000, não deve ser usada no cálculo do valor total (isto é, CouponValue deve ser zero). ReferirRefatorando o código usando o Strategy Pattern Além disso.

Nota: estou usando.Net 4.0

Referência:

Obtendo um erro ao usar o ObjectContext.AddObject com o Entity FrameworkRefatorando o código usando o Strategy PatternPrefere composição sobre herança?Code-first vs Model / Database-firstPadrão de Estratégia e Injeção de Dependência usando UnityPadrão de Design de Estratégia C # por Delegado vs OOPComo usar o padrão de estratégia com c #?Herança com o Código EF Primeiro: Parte 2 - Tabela 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();
    }
}

Repositório:

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