假设我有一个不可变的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>
答案 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等基元的想法。组件还可以包含其他组件。