Pregunta

Digamos que tengo un IcomposeUstype inmutable para tratar con un Derange, o dinero, y luego resulta que tengo otro objeto de valor (es decir, inmutable) que tiene un valor de propiedad de Derange o Money. Por ejemplo, un nombre que tiene un período efectivo (Daterange).

El DatoGeArangeUsertype encapsula algo de lógica que no quisiera duplicarse.

¿Puedo reutilizar mi DataArangeUsertype dentro de un nombre de nombre? ¿Cómo?

Salud,
Berryl

ACTUALIZAR

A continuación se muestra el comentario resumido en IcomposeUsertype tomado del código fuente nHibernate que sugiere lo que estoy pensando que se puede hacer, pero no estoy seguro de cómo. Es cierto que la estrategia de componentes es fácil y funciona muy bien, hasta que crea que es posible que desee usar el mismo componente en otro lugar

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

Uso de la asignación de componentes

<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>    
¿Fue útil?

Solución

Hibernate le permite componer tipos de valor en componentes:

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

Las clases se ven así:

// entity
public class MyClass {
    private NamedPeriod _namedPeriod;
}

// immutable value object
public class NamedPeriod {
    private readonly String _name;
    // immutable value object
    private readonly DateRange _effectivePeriod;
}

La idea de que usa usertypes para primitivas como el daterange y el dinero y el componente para un valor de valor inmutable más grande. Los componentes también pueden incluir otros componentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top