Question

Dire que j'ai un ICompositeUserType immuable pour faire face à un DateRange, ou l'argent, puis il se trouve que j'ai un autre objet de valeur (par exemple, immuable) qui a soit une valeur de propriété DateRange ou l'argent dedans. Par exemple, un nom qui a un EffectivePeriod (DateRange).

Le DataRangeUserType encapsule une certaine logique, je ne voudrais pas que dupliquée.

Puis-je réutiliser mon DataRangeUserType à l'intérieur d'un NameUserType? Comment?

Cheers,
Berryl

UPDATE

Ci-dessous le commentaire de synthèse sur ICompositeUserType pris à partir du code source NHibernate ce qui laisse supposer ce que je pense peut être fait, mais pas sûr de savoir comment. Certes, la stratégie de la composante est facile et fonctionne très bien, jusqu'à ce que vous pensez que vous pouvez utiliser ailleurs le même compoent

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

Utilisation de la cartographie composant

<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>    
Était-ce utile?

La solution

Mise en veille prolongée vous permet de types de valeur dans les composants Compose:

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

Les classes ressemblent à ceci:

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

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

L'idée que vous utilisez pour UserTypes primitives comme DateRange et de l'argent et de composants pour une valeur immuable des objets plus grands. Les composants peuvent également inclure d'autres composants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top