Domanda

Di 'Ho un ICompositeUserType immutabile per affrontare un DateRange, o denaro, e poi si scopre che ho un altro oggetto di valore (cioè, immutabile) che dispone di un valore di proprietà DateRange o denaro in essa. Ad esempio, un nome che ha un EffectivePeriod (DateRange).

Il DataRangeUserType incapsula una certa logica non vorrei duplicato.

Posso riutilizzare la mia DataRangeUserType all'interno di un NameUserType? Come?

Saluti,
Berryl

UPDATE

Di seguito è riportato il commento di sintesi sulle ICompositeUserType tratto dal codice sorgente NHibernate che suggerisce quello che sto pensando che si può fare, semplicemente non so come. Certo, la strategia componente è facile e funziona alla grande, fino a quando si pensa che si potrebbe desiderare di utilizzare la stessa compoent altrove

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

<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>    
È stato utile?

Soluzione

Hibernate permette di realizzare i tipi di valore di composizione in Componenti:

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

Le classi simile a questa:

// 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'idea che si utilizza per UserTypes primitive come DateRange e denaro e dei componenti per un valore immutabile grande oggetti. I componenti possono includere anche altri componenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top