事業内容:
GiftCoupon、ClubMembershipCard などを使用して支払いを行うことができる支払いシステムがあります。1 つの支払い自体に複数の支払いコンポーネントを含めることができます。
クラス:
私は支払いクラスを持っています。GiftCouponPayment、ClubMembershipCardPayment、CashPayment などの支払いコンポーネントがあります。各コンポーネント タイプは、共通のインターフェイス IPaymentComponent を満たします。既存の型に関する知識を使用して実装しました。
質問
1)存在するすべての型を知らずに、この関数を抽象的な方法で実装する方法は? つまり、IPaymentComponent インターフェイスを実装するすべてのタイプで機能する必要があります。
2) LINQ to SQL で実現できない場合、Entity Framework で実現できますか?
3) LINQ to SQLが Payment オブジェクト内で GiftCouponPayment エンティティを生成するとき、それは関連付け/集約または構成ですか?
注: ORM として LINQ to SQL を使用しています。GiftCouponPayment と Payment は自動生成されたクラスであり、これらのオブジェクトは ORM によって作成されます。部分クラスを使用して、これらのクラスにさらに機能を追加しました。
注: データベースでは、各 PaymentComponent (GiftCouponPayment など) には独自のプロパティ (CouponValue、CardValue など) があります。したがって、Table-Per-Hierarchy は適切ではありません。別々のテーブルが必要です。その行に解決策はありますか?
注: GiftCouponPayment は、この支払いの前にデータベースに既に存在します。顧客から提供された GiftCouponPaymentID を使用して、GiftCouponPayment オブジェクトを識別する必要があります。このテーブルの PaymentID 列を更新するだけです。
漏れやすい抽象化とは、複雑さを軽減 (または非表示) することを目的として実装された抽象化を指し、基礎となる詳細が完全には隠されていません。
LINQ to SQL ダイアグラム
参考:
- Entity Framework 4、継承と拡張?
- 継承戦略の選択方法http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx
- 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;
}
}