2009-05-04 9 views
4

Wesentlichen der Titel dieser Frage erklärt die essense von dem, was ich zu tun versuchen, sondern ein konstruiertes Beispiel zu erstellen ...Karte eine Strategie-Muster mit Fluent NHibernate

ich eine Klasse haben, rufen Sie es Mitarbeiter. Mitarbeiter hat eine IPaymentBehaviour ...

public class Employee 
{ 
    IPaymentBehaviour _paymentBehaviour; 

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

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

} 

Dies entspricht einer Datenbanktabelle wie folgt:

dbo.Employees
-> EmployeeId (Primärschlüssel)
-> PaymentBehaviourId (Fremdschlüsseltabelle zum Nachschlagen
) -> Field1
-> Field2
-> Field3
-> Field4

Abhängig vom Wert von PaymentBehaviourId muss ich eine andere Implementierung von IPaymentBehaviour in das Employee-Objekt "injizieren". Abhängig davon, welcher PaymentBehaviour verwendet wurde, kann Field1, 2, 3 oder 4 erforderlich sein, um dieses Verhalten zu erstellen.

Kann mir jemand sagen, wie dies mit Fluent-NHibernate abgebildet werden würde?

+0

Was meinen Sie mit "Feld1, 2, 3 oder 4 könnte erforderlich sein, um dieses Verhalten zu erstellen"? Was meinst du mit "erstellen"? Ist es möglich, das Datenbankdesign zu ändern? –

+0

Ich meine, das sind die Namen in der Tabelle, und abhängig davon, welches Verhalten erforderlich ist, würden Sie diese Felder verwenden, um die Instanz dieses Verhaltens zu erstellen. Es ist möglich, das db-Design zu ändern, ja, aber wir haben viele mögliche Kombinationen, so dass es so allgemein wie möglich sein muss. – KevinT

Antwort

2

Tabelle Mitarbeiter

  • EmployeeId (Primärschlüssel)
  • PaymentBehaviourId (Fremdschlüssel PaymentBehaviour)

Tabelle PaymentBehaviour

  • PaymentBehaviourId (pk)
  • Typ (Diskriminator)
  • Field1
  • Field2
  • Field3
  • Field4

Klassen

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; } 
} 

Ich weiß FluentNHibernate nicht genug zu sagen, wie es aussieht, aber in XML würden Sie es so spezifizieren:

<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 verwendet den Standardkonstruktor zum Instanziieren von Entitäten. Es gibt jedoch some Problemumgehungen.

0

Ich glaube, ich würde so um es:

  • Erstellen Sie eine Standard Constructur auf dem Employee-Objekt, das einen private Zugriffsmodifikator hat, so dass NHibernate diese Typen rekonstruieren können
  • ein erstellen Interceptor in dem Sie die entsprechenden Methoden überladen (OnLoad ich vermute), in dem Sie sicher machen, dass Sie die richtige IPaymentBehaviour Implementierung in die Entität injizieren. (Vielleicht können Sie schaffen eine Schnittstelle ‚IPaymentBehaviourInjectable‘ dass durch die Mitarbeiter Klasse implementiert werden (implementieren es Ausdrücklich), so dass Sie die richtige Verhalten in das Unternehmen injizieren ...
Verwandte Themen