Mappare un modello di strategia usando NHibernate fluente
-
03-07-2019 - |
Domanda
Essenzialmente il titolo di questa domanda spiega l'essenza di ciò che sto cercando di fare, ma per creare un esempio inventato ...
Ho un corso, chiamalo Dipendente. Il dipendente ha un comportamento di pagamento IP ...
public class Employee
{
IPaymentBehaviour _paymentBehaviour;
protected internal Employee() { /* required by NH */}
public Employee(IPaymentBehaviour paymentBehaviour)
{
_paymentBehaviour = paymentBehaviour;
}
}
Ciò corrisponde a una tabella di database in questo modo:
dbo.Employees
- > EmployeeId (chiave primaria)
- > PaymentBehaviourId (chiave esterna per la tabella di ricerca)
- > Field1
- > Field2
- > field3
- > Campo4
A seconda del valore di PaymentBehaviourId ho bisogno di 'iniettare' una diversa implementazione di IPaymentBehaviour nell'oggetto Employee. A seconda del pagamento utilizzato, potrebbe essere necessario Field1, 2, 3 o 4 per creare quel comportamento.
Qualcuno può dirmi come sarebbe mappato usando Fluent-NHibernate?
Soluzione
tabella Dipendenti
- EmployeeId (chiave primaria)
- PaymentBehaviourId (chiave esterna per PaymentBehaviour)
tabella PaymentBehaviour
- PaymentBehaviourId (pk)
- tipo (discriminatore)
- Field1
- Field2
- Field3
- Campo4
Corsi
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; }
}
Non conosco FluentNHibernate abbastanza per dirti come appare, ma in XML lo specificheresti in questo modo:
<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>
Altri suggerimenti
NHibernate utilizza il costruttore predefinito per istanziare le entità. Ci sono comunque alcune soluzioni alternative.
Penso che vorrei aggirare il problema in questo modo:
- Crea un costruttore predefinito sul
Oggetto dipendente, che ha un
modificatore di accesso
privato
, in modo che NHibernate possa ricostruire quei tipi - Crea un intercettore in cui sovraccarichi i metodi appropriati
(OnLoad presumo), in cui fai
sicuro di aver iniettato il corretto
Implementazione
IPaymentBehaviour
nell'entità. (Forse puoi creare un'interfaccia 'IPaymentBehaviourInjectable' quello può essere implementato dal Dipendente classe (implementala esplicitamente), quindi che puoi iniettare il corretto comportamento nell'entità ...