Mapper un modèle de stratégie à l'aide de NHibernate Fluent
-
03-07-2019 - |
Question
Essentiellement, le titre de cette question explique l'essentiel de ce que j'essaie de faire, mais pour créer un exemple artificiel ...
J'ai un cours, appelez-le Employé. Un employé a un comportement IPaymentBehaviour ...
public class Employee
{
IPaymentBehaviour _paymentBehaviour;
protected internal Employee() { /* required by NH */}
public Employee(IPaymentBehaviour paymentBehaviour)
{
_paymentBehaviour = paymentBehaviour;
}
}
Ceci correspond à une table de base de données telle que:
dbo.Employees
- > EmployeeId (clé primaire)
- > PaymentBehaviourId (clé étrangère de la table de recherche)
- > Field1
- > Field2
- > Field3
- > Field4
En fonction de la valeur de PaymentBehaviourId, je dois "injecter" une implémentation différente de IPaymentBehaviour dans l'objet Employee. Selon le type de comportement PaymentBei utilisé, les champs 1, 2, 3 ou 4 peuvent être nécessaires pour créer ce comportement.
Quelqu'un peut-il me dire comment cela serait mappé avec Fluent-NHibernate?
La solution
Employés de la table
- EmployeeId (clé primaire)
- PaymentBehaviourId (clé étrangère à PaymentBehaviour)
table PaymentBehaviour
- PaymentBehaviourId (pk)
- type (discriminateur)
- Champ1
- Champ2
- Champ3
- Champ4
Classes
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; }
}
Je ne connais pas assez FluentNHibernate pour vous dire à quoi ça ressemble, mais en XML, vous le spécifieriez ainsi:
<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>
Autres conseils
NHibernate utilise le constructeur par défaut pour instancier des entités. Il existe cependant des solutions .
Je pense que je travaillerais comme ça:
- Créez une construction par défaut sur le
Objet employé, qui a un
private
modificateur d'accès, afin que NHibernate puisse reconstruire ces types - Créez un intercepteur dans lequel vous surchargez les méthodes appropriées
(OnLoad je présume), dans lequel vous faites
sûr que vous injectez le bon
Implémentation de
IPaymentBehaviour
dans l'entité. (Peut-être que vous pouvez créer une interface 'IPaymentBehaviourInjectable' qui peut être mis en œuvre par l'employé classe (implémenter explicitement), donc que vous pouvez injecter le bon comportement dans l'entité ...