Obtener todos los objetos asociados / compuestos dentro de un objeto (en forma abstracta)

Negocio:

Tengo un sistema de pago en el que se puede realizar el pago a través de GiftCoupon, ClubMembershipCard, etc. Un pago en sí puede tener varios componentes de pago

Clase:

Tengo una clase de pago. Tiene componentes de pago como GiftCouponPayment, ClubMembershipCardPayment, CashPayment, etc. Cada tipo de componente satisface una interfaz común IPaymentComponent. Lo he implementado utilizando el conocimiento sobre los tipos existentes.

Preguntas

1) ¿Cómo implementar esta función en unresumen ¿Camino - sin saber cuáles son todos los tipos que existen? Eso significa que debe funcionar para todos los tipos que implementan la interfaz IPaymentComponent.

2) Si no es posible lograrlo en LINQ to SQL, ¿es posible en Entity Framework?

3) ¿Es asociación / agregación o composición cuando?LINQ to SQL ¿Generar entidades GiftCouponPayment dentro de objeto de pago?

Nota: Estoy usando LINQ to SQL como ORM. GiftCouponPayment y Payment son clases generadas automáticamente y estos objetos son creados por ORM. He agregado más funcionalidad a estas clases usando clases parciales.

Nota: En la base de datos, cada PagoComponente (por ejemplo, GiftCouponPayment) tiene sus propias propiedades (por ejemplo, CouponValue, CardValue, etc.). Por lo tantoLa tabla por jerarquía no será buena. Necesitamos mesas separadas. ¿Hay una solución en esa línea?

Nota: GiftCouponPayment ya existe en la base de datos antes de este pago. Necesitamos identificar el objeto GiftCouponPayment mediante el uso de GiftCouponPaymentID proporcionado por el cliente. Solo necesitamos actualizar la columna PaymentID en esta tabla.

Una abstracción con fugas se refiere a cualquier abstracción implementada, destinada a reducir (u ocultar) la complejidad, donde los detalles subyacentes no están completamente ocultos

Diagrama de LINQ to SQL

REFERENCIA:

Entity Framework 4, ¿heredar vs extender?Cómo elegir una estrategia de herenciahttp://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspxMuestras API fluidas -http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx

CÓDIGO C #

public interface IPaymentComponent
{
     int MyID { get; set; }
     int MyValue { get; set; }
     int GetEffectiveValue();
}


public partial class GiftCouponPayment : IPaymentComponent
{
    public int MyID
    {
        get 
        { 
            return this.GiftCouponPaymentID; 
        }
        set 
        { 
            this.GiftCouponPaymentID = value; 
        }
    }

    public int MyValue
    {
        get 
        { 
            return this.CouponValue; 
        }
        set 
        { 
            this.CouponValue = value; 
        }
    }

    public int GetEffectiveValue()
    {
        if (this.CouponNumber < 2000)
        {
            return 0;
        }
        return this.CouponValue;
    }
}

public partial class Payment
{
    public List<IPaymentComponent> AllPaymentComponents()
    {
        List<IPaymentComponent> allPayComps = new List<IPaymentComponent>();


        List<GiftCouponPayment> giftCouponPaymentList = new List<GiftCouponPayment>();
        List<CashPayment> cashPaymentList = new List<CashPayment>();

        foreach (GiftCouponPayment g in this.GiftCouponPayments)
        {
            giftCouponPaymentList.Add(g);
            allPayComps.Add(g);
        }

        foreach (CashPayment c in this.CashPayments)
        {
            cashPaymentList.Add(c);
            allPayComps.Add(c);
        }

        return allPayComps;


    }
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta