2009-05-04 3 views
4

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

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

public class Employee 
{ 
    IPaymentBehaviour _paymentBehaviour; 

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

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

} 

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

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

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

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

+0

Что значит «Field1, 2, 3 или 4, возможно, потребуется для создания этого поведения»? Что значит «создать»? Можно ли изменить дизайн базы данных? –

+0

Я имею в виду, что это имена в таблице, и в зависимости от того, какое поведение требуется, вы должны использовать эти поля для создания экземпляра этого поведения. Можно изменить дизайн db, да, но у нас есть много возможных комбинаций, поэтому он должен быть как можно более общим. – KevinT

ответ

2

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

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

столик PaymentBehaviour

  • PaymentBehaviourId (рк)
  • типа (дискриминатор)
  • 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

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

0

Я думаю, что будет работать вокруг него, как это:

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