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