nhibernate состав типа пользователя - PullRequest
1 голос
/ 06 сентября 2011

Скажем, у меня есть неизменный ICompositeUserType для работы с DateRange или Money, и затем выясняется, что у меня есть другой объект-значение (т.е. неизменяемый), в котором есть значение свойства DateRange или Money. Например, Имя, которое имеет EffectivePeriod (DateRange).

DataRangeUserType инкапсулирует некоторую логику, которую я бы не хотел дублировать.

Могу ли я повторно использовать свой DataRangeUserType внутри NameUserType? Как?

Приветствия
Berryl

UPDATE

Ниже приведен краткий комментарий к ICompositeUserType, взятый из исходного кода NHibernate, который предлагает то, о чем я думаю, может быть сделано, просто не знаю, как это сделать. Следует признать, что стратегия компонентов проста и прекрасно работает, пока вы не решите использовать тот же компонент где-либо еще

/// <summary>
/// A UserType that may be dereferenced in a query.
/// This interface allows a custom type to define "properties".
/// These need not necessarily correspond to physical .NET style properties.
///
/// A ICompositeUserType may be used in almost every way
/// that a component may be used. It may even contain many-to-one
/// associations.
///
/// ...
/// </summary>

Использование сопоставления компонентов

<component name="MyCompositeComponent" class="...">

  <property name="Name" not-null="true" length="50"/>

  <property name="Price" type="...MoneyUserType">
      <column name="Amount"/>
      <column name="Currency"/>
  </property> 

  <property name="EffectivePeriod" type="...DateRangeUserType">
      <column name="EffectiveStart"/>
      <column name="EffectiveEnd"/>
  </property> 

</component>    

1 Ответ

1 голос
/ 07 сентября 2011

Hibernate позволяет создавать типы значений в компонентах:

<class name="MyClass" table="MyTable" >
  ...
  <component name="_namedPeriod">

      <property name="_name" column="PeriodName" />

      <property name="_effectivePeriod" 
                type="MyNamespace.DataRangeUserType, MyAssembly" >

          <column name="PeriodStart" />
          <column name="PeriodEnd" />
      </property>

  </component>
  ...
</class>

Классы выглядят так:

// entity
public class MyClass {
    private NamedPeriod _namedPeriod;
}

// immutable value object
public class NamedPeriod {
    private readonly String _name;
    // immutable value object
    private readonly DateRange _effectivePeriod;
}

Идея, что вы используете UserTypes для примитивов, таких как DateRange и Money and Component, для объектов с большей неизменной стоимостью. Компоненты могут также включать другие компоненты.

...