質問

daterangeまたはお金を扱うための不変のicompositeusertypeを持っているとし、それから私はそれにdaterangeまたはお金の財産値を持っている別の価値オブジェクト(すなわち、不変)を持っていることがわかります。たとえば、有効期間(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>    
役に立ちましたか?

解決

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

より大きな不変の価値オブジェクトのために、daterangeやお金やコンポーネントなどのプリミティブにusertypesを使用するという考え。コンポーネントには、他のコンポーネントも含めることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top