Состав пользовательского типа nhibernate

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

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

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

С уважением,
Беррил

ОБНОВИТЬ

Ниже приведен краткий комментарий к 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>    

person Berryl    schedule 06.09.2011    source источник


Ответы (1)


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 и Component для больших неизменяемых объектов значений. Компоненты также могут включать в себя другие компоненты.

person Dmitry    schedule 07.09.2011