Бизнес:
У меня есть платежная система, в которой оплата может быть произведена через 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
ССЫЛКА:
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;
}
}