Получить все ассоциированные/составные объекты внутри объекта (абстрактным способом)

Бизнес:

У меня есть платежная система, в которой оплата может быть произведена через GiftCoupon, ClubMembershipCard и т.д. Один платеж сам по себе может иметь несколько платежных компонентов

Класс:

У меня есть класс оплаты. Он имеет платежные компоненты, такие как GiftCouponPayment, ClubMembershipCardPayment, CashPayment и так далее. Каждый тип компонента удовлетворяет общему интерфейсу IPaymentComponent. Я реализовал это, используя знания о существующих типах.

Вопросы

1 )Как реализовать эту функцию абстрактным способом, не зная, какие типы существуют? Это означает, что он должен работать для всех типов, реализующих интерфейс IPaymentComponent.

2 )Если это невозможно сделать в LINQ to SQL, возможно ли это в Entity Framework?

3 )Является ли это ассоциацией/агрегацией или композицией, когда LINQ to SQL генерирует объекты GiftCouponPayment внутри объекта Payment?

Примечание :Я использую LINQ to SQL в качестве ORM.GiftCouponPayment и Payment — это автоматически сгенерированные классы, и эти объекты создаются ORM. Я добавил больше функциональности к этим классам, используя разделяемые классы.

Примечание :В базе данных каждый компонент PaymentComponent (E.G. GiftCouponPayment )имеет свои собственные свойства (, например CouponValue, CardValue и т. д. ). Следовательно Таблица -Per -Иерархия не будет хорошей . Нам нужны отдельные столы. Есть ли решение в этой строке?

Примечание :GiftCouponPayment уже существовал в базе данных до этого платежа. Нам нужно идентифицировать объект GiftCouponPayment, используя GiftCouponPaymentID, предоставленный клиентом. Нам просто нужно обновить столбец PaymentID в этой таблице.

A leaky abstraction refers to any implemented abstraction, intended to reduce (or hide) complexity, where the underlying details are not completely hidden

Схема LINQ to SQL

enter image description here

ССЫЛКА:

  1. Entity Framework 4, наследование или расширение?
  2. Как выбрать стратегию наследованияhttp://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx
  3. Свободные образцы API-http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-fluent-api-samples.aspx

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 AllPaymentComponents()
    {
        List allPayComps = new List();


        List giftCouponPaymentList = new List();
        List cashPaymentList = new List();

        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;


    }
}

6
задан 14 revs 23 May 2017 в 12:07
поделиться