Композиция типа пользователя nhibernate
-
27-10-2019 - |
Вопрос
Скажем, у меня есть неизменная iCompositeSertype для борьбы с заливкой или денег, и затем оказывается, что у меня есть еще один объект Value (т. Е. Необвисываемый), который имеет в нем либо датурж, либо стоимость имущества Money. Например, имя, которое имеет эффективноепериод (Daterange).
DataRAngeUserType инкапсулирует некоторую логику, которую я не хотел бы дублировать.
Могу ли я повторно использовать свой DataRAngeUserType внутри названия? Как?
Ваше здоровье,
Беррил
ОБНОВИТЬ
Ниже приведен краткий комментарий к IcompositeSertype, взятому из исходного кода Nhibernate, который предполагает, о чем я думаю, можно сделать, просто не уверен, как. По общему признанию, компонентная стратегия проста и отлично работает, пока вы не думаете, что захотите использовать тот же компонент в другом месте
/// <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;
}
Идея, что вы используете usertypes для примитивов, таких как Daterange, Money и Component для более крупных объектов стоимости. Компоненты также могут включать другие компоненты.