Сопоставьте шаблон стратегии с помощью Fluent NHibernate - PullRequest
4 голосов
/ 04 мая 2009

По сути, заголовок этого вопроса объясняет суть того, что я пытаюсь сделать, но создать надуманный пример ...

У меня есть класс, назовите его Сотрудник. У сотрудника есть IPaymentBehaviour ...

public class Employee 
{
  IPaymentBehaviour _paymentBehaviour;

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

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

}

Это соответствует таблице базы данных примерно так:

dbo.Employees
-> EmployeeId (первичный ключ)
-> PaymentBehaviourId (внешний ключ для таблицы поиска)
-> Поле1
-> Field2
-> Field3
-> Поле4

В зависимости от значения PaymentBehaviourId мне нужно «внедрить» другую реализацию IPaymentBehaviour в объект Employee. В зависимости от того, какой платеж использовался, для создания такого поведения могут потребоваться поля 1, 2, 3 или 4.

Может кто-нибудь сказать мне, как это будет отображаться с помощью Fluent-NHibernate?

Ответы [ 3 ]

2 голосов
/ 04 мая 2009

Стол сотрудников

  • EmployeeId (первичный ключ)
  • PaymentBehaviourId (внешний ключ для PaymentBehaviour)

таблица PaymentBehaviour

  • PaymentBehaviourId (pk)
  • тип (дискриминатор)
  • Field1
  • Field2
  • Field3
  • Field4

Классы

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 голос
/ 04 мая 2009

NHibernate использует конструктор по умолчанию для создания экземпляров сущностей. Однако есть некоторые обходные пути.

0 голосов
/ 04 мая 2009

Думаю, я бы обошел это так:

  • Создать конструктор по умолчанию на Объект сотрудника, который имеет private модификатор доступа, так что NHibernate может реконструировать эти типы
  • Создайте Перехватчик, в котором вы перегрузите соответствующие методы (OnLoad я предполагаю), в котором вы делаете уверен, что вы вводите правильный IPaymentBehaviour реализация в сущность. (Возможно, вы можете создать интерфейс «IPaymentBehaviourInjectable», который может быть реализовано сотрудником класс (реализовать это явно), так что вы можете ввести правильный поведение в сущности ...
...