2009-05-04 6 views
4

を使用して戦略パターンは、基本的にこの質問のタイトルは私がやろうとしていますが、不自然な例を作成するために、何のエッセンスを説明私は従業員を呼び出し、クラスを持っている...流暢NHibernateは

の地図。 - >社員(主キー)
- テーブルを検索する> PaymentBehaviourId(外部キー

dbo.Employees
:従業員はIPaymentBehaviourを持っている...

public class Employee 
{ 
    IPaymentBehaviour _paymentBehaviour; 

    protected internal Employee() { /* required by NH */} 

    public Employee(IPaymentBehaviour paymentBehaviour) 
    { 
    _paymentBehaviour = paymentBehaviour; 
    } 

} 

これはそうのようなデータベーステーブルに対応します)
- >フィールド1
- >フィールド2
- >フィールド3
- >フィールド4

PaymentBehaviourIdの値に応じて、私はEmployeeオブジェクトにIPaymentBehaviourの別の実装を '注入'する必要があります。どのPaymentBehaviourが使用されているかによって、その動作を作成するためにField1,2,3または4が必要になることがあります。

Fluent-NHibernateを使用してこれがどのようにマッピングされるか教えていただけますか?

+0

「この動作を作成するにはField1,2,3または4が必要な場合があります」とはどういう意味ですか? 「作成する」とはどういう意味ですか?データベースの設計を変更することは可能ですか? –

+0

私はそれらがテーブル内の名前であり、どの動作が必要なのかに応じて、それらのフィールドを使用してその動作のインスタンスを作成することを意味します。 dbデザインを変更することは可能ですが、可能な限り多くの組み合わせが可能なので、できるだけジェネリックにする必要があります。 – KevinT

答えて

2

テーブル社員

  • 社員(プライマリキー)
  • PaymentBehaviourId(PaymentBehaviourへの外部キー)

テーブルPaymentBehaviour

  • PaymentBehaviourId(PK)
  • タイプ(弁別)
  • フィールド1
  • フィールド2
  • フィールド3
  • フィールド4

クラス

public class Employee 
{ 
    /* ... */ 
    public PaymentBehaviour PaymentBehaviour { get; set; } 
} 

public class PaymentBehaviourA : IPaymentBehaviour 
{ 
    /* ... */ 
    public int Field1 { get; set; } 
} 

public class PaymentBehaviourB : IPaymentBehaviour 
{ 
    /* ... */ 
    public int Field2 { get; set; } 
} 

私は、それがどのように見えるかを教えてくれのに十分FluentNHibernate知りませんXMLでは次のように指定します:

<class name="Employee" table="Employees"> 
    <many-to-one name="PaymentBehaviour" class="IPaymentBehaviour"> 
</class> 

<class name="IPaymentBehaviour" abstract="true" > 
    <discriminator column="type"/> 

    <subclass name="PaymentBehaviourA" discriminator-value="A"> 
    <propert name="Field1"/> 
    </subclass> 

    <subclass name="PaymentBehaviourB" discriminator-value="B"> 
    <propert name="Field2"/> 
    </subclass> 
</class> 
1

NHibernateは、デフォルトのコンストラクタを使用してエンティティをインスタンス化します。しかし、someの回避策があります。

0

は、私はこのようにそれを回避するだろうと思う:

  • 作成NHibernateのは、これらの型を再構築することができるように

    • は、 privateアクセス修飾子を持つ Employeeオブジェクト、上のデフォルトconstructurを作成します。適切なメソッドをオーバーロードするインターセプタ (OnLoad Iは仮定します)。 は、正しい IPaymentBehaviourの実装 をエンティティに挿入することを確実にします。 (おそらく、あなたは ので あなたが実体に正しい 行動を注入できること、()explicitilyそれを実装 は、従業員 クラスによって実装できることをインタフェース 「IPaymentBehaviourInjectable」を作成することができます...
  • 関連する問題