Frage

Sagen Sie, ich habe einen unveränderlichen iCompositeusertype, um mit einem Daterange oder Geld umzugehen, und dann stellt sich heraus, dass ich ein anderes Wertobjekt (dh unveränderlich) habe, das entweder einen Daterange- oder ein Geld -Immobilien -Wert darin hat. Zum Beispiel ein Name mit einer effektiven Periode (Daterange).

Der DatarangeUserType verkauft eine Logik, die ich nicht duplizieren möchte.

Kann ich meinen DatarangeSertype in einem Namensertype wiederverwenden? Wie?

Prost,
Berryl

AKTUALISIEREN

Im Folgenden finden Sie die zusammenfassende Kommentar zu icompositeusertype aus dem Nhibernate -Quellcode, wonach ich denke, woran ich denke, dass er getan werden kann, nur nicht sicher wie. Zugegeben, die Komponentenstrategie ist einfach und funktioniert großartig, bis Sie der Meinung sind

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

Verwenden der Komponentenzuordnung

<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>    
War es hilfreich?

Lösung

Mit Hibernate können Sie Werttypen in Komponenten komponieren:

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

Klassen sehen so aus:

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

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

Die Idee, dass Sie Benutzertypen für Primitive wie Daterange, Geld und Komponente für ein größeres unveränderliches Wertobjekt verwenden. Komponenten können auch andere Komponenten enthalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top