gpt4 book ai didi

c# - 获取对象内的所有关联/复合对象(以抽象方式)

转载 作者:太空狗 更新时间:2023-10-29 21:51:18 25 4
gpt4 key购买 nike

商业:

我有一个支付系统,可以通过 GiftCoupon、ClubMembershipCard 等进行支付。一次支付本身可以有多个支付组件

:

我有一个支付类。它具有 GiftCouponPayment、ClubMembershipCardPayment、CashPayment 等支付组件。每个组件类型都满足一个公共(public)接口(interface) IPaymentComponent。我已经使用现有类型的知识实现了它。

问题

1) 如何以抽象的方式实现这个功能——不知道存在的所有类型是什么?这意味着它需要适用于所有实现 IPaymentComponent 接口(interface)的类型。

2)如果在LINQ to SQL中无法实现,在Entity Framework中是否可以实现?

3)LINQ to SQL在Payment对象中生成GiftCouponPayment实体是关联/聚合还是组合?

注意:我使用 LINQ to SQL 作为 ORM。 GiftCouponPayment 和 Payment 是自动生成的类,这些对象由 ORM 创建。我通过使用部分类向这些类添加了更多功能。

注意:在数据库中,每个 PaymentComponent(例如 GiftCouponPayment)都有自己的属性(例如 CouponValue、CardValue 等)。因此,Table-Per-Hierarchy 并不好。我们需要单独的表。那行有解决方案吗?

注意:在此付款之前,GiftCouponPayment 已存在于数据库中。我们需要通过客户提供的 GiftCouponPaymentID 来识别 GiftCouponPayment 对象。我们只需要更新此表中的 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, inheriting vs extending?
  2. 如何选择继承策略 http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx
  3. Fluent 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<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;


}
}

最佳答案

我想您可能想暂时退出设计。我听到的是这样的:

A payment consists of one or more components, and each component can be one of a variety of types

听起来您需要的是一个Payment 表,然后是一个PaymentComponent 表,该表具有返回到Payment 表的外键关系。然后,您可以为各种付款方式在 PaymentComponent 表上实现继承。

关于c# - 获取对象内的所有关联/复合对象(以抽象方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com