nhibernate用户类型组合

nhibernate用户类型组合,nhibernate,usertype,compositeusertype,Nhibernate,Usertype,Compositeusertype,假设我有一个不可变的ICompositeUserType来处理DateRange或Money,然后发现我有另一个value对象(即,immutable),其中包含DateRange或Money属性值。例如,具有有效期(DateRange)的名称 DataRangeUserType封装了一些我不想重复的逻辑 我可以在NameUserType中重用我的DataRangeUserType吗?怎么做 干杯, 贝里尔 更新 下面是对取自NHibernate源代码的ICompositeUserType的总结

假设我有一个不可变的ICompositeUserType来处理DateRange或Money,然后发现我有另一个value对象(即,immutable),其中包含DateRange或Money属性值。例如,具有有效期(DateRange)的名称

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

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

干杯,
贝里尔

更新 下面是对取自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>
//
///可以在查询中取消引用的用户类型。
///此接口允许自定义类型定义“属性”。
///这些属性不一定对应于物理.NET样式的属性。
///
///ICompositeUserType几乎可以以各种方式使用
///可以使用组件。它甚至可能包含多对一
///协会。
///
/// ...
/// 
使用组件映射
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>

将用户类型用于DateRange和Money等原语,并将组件用于更大的不可变值对象。组件还可以包括其他组件。

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>
将用户类型用于DateRange和Money等原语,并将组件用于更大的不可变值对象。组件还可以包括其他组件

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

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