【问题标题】:nhibernate user type compositionnhibernate用户类型组合
【发布时间】:2011-09-06 16:02:40
【问题描述】:

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

使用组件映射

<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>    

【问题讨论】:

    标签: nhibernate usertype compositeusertype


    【解决方案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 用于更大的不可变值对象的想法。组件还可以包含其他组件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多