nhibernate用户类型组成

时间:2011-09-06 16:02:41

标签: nhibernate usertype compositeusertype

假设我有一个不可变的ICompositeUserType来处理DateRange或Money,然后事实证明我有另一个值对象(即,不可变),其中包含DateRange或Money属性值。例如,具有EffectivePeriod(DateRange)的名称。

DataRangeUserType封装了一些我不想复制的逻辑。

我可以在NameUserType中重用我的DataRangeUserType吗?怎么样?

干杯,
Berryl

更新

以下是从NHibernate源代码中获取的ICompositeUserType的摘要注释,它表明我在想什么,只是不确定如何。不可否认,组件策略很简单,效果很好,直到您认为您可能想在其他地方使用相同的组件

/// <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 个答案:

答案 0 :(得分: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等基元的想法。组件还可以包含其他组件。