Propiedades de almacenamiento calculadas y personalizadas

Todas las propiedades de dominio en un idioma específico de dominio (DSL) se pueden mostrar al usuario en el diagrama y en el explorador de idiomas. Además, se puede acceder a ellas mediante código de programa. Sin embargo, las propiedades difieren en la forma en que se almacenan sus valores.

Variantes de propiedades de dominio

En la definición de DSL, puede establecer la variante de una propiedad de dominio, como se muestra en la siguiente tabla:

Variante de propiedad de dominio Descripción
Estándar (Predeterminado) Propiedad de dominio que se guarda en el almacén y se serializa en el archivo.
Calculadas Una propiedad de dominio de solo lectura que no se guarda en el almacén, pero se calcula a partir de otros valores. Por ejemplo, Person.Age podría calcularse a partir de Person.BirthDate. Debe proporcionar el código que realiza el cálculo. Normalmente, se calcula el valor de otras propiedades de dominio. Sin embargo, también se pueden usar recursos externos.
Almacenamiento personalizado Una propiedad de dominio que no se guarda directamente en el almacén, pero puede ser get y set. Debe proporcionar los métodos que obtienen y establecen el valor. Por ejemplo, Person.FullAddress podría almacenarse en Person.StreetAddress, Person.City y Person.PostalCode. También puede acceder a recursos externos, por ejemplo, para obtener y establecer valores de una base de datos. El código no debe establecer valores en el almacén cuando Store.InUndoRedoOrRollback es true. Consulte Transacciones y establecedores personalizados.

Proporcionar código para una propiedad de almacenamiento

Si establece la variante de una propiedad de dominio en un almacenamiento calculado o personalizado, debe proporcionar métodos de acceso. Al compilar la solución, un informe de errores indica lo que es necesario.

Para definir una propiedad de almacenamiento calculada o personalizada

  1. En DslDefinition.dsl, seleccione la propiedad de dominio en el diagrama o en el Explorador DSL.

  2. En la ventana Propiedades, establezca el campo Variante en Calculado o Almacenamiento personalizado.

    Asegúrese de que también ha establecido su Tipo en lo que desea.

  3. Seleccione Transformar todas las plantillas en la barra de herramientas del Explorador de soluciones.

  4. En el menú Compilar, seleccione Compilar solución.

    Recibe el siguiente mensaje de error: "<YourClass> no contiene una definición para Get<YourProperty>".

  5. Haga doble clic en el mensaje de errores.

    Se abre Dsl\GeneratedCode\DomainClasses.cs o DomainRelationships.cs. Sobre la llamada al método resaltado, un comentario le pide que proporcione una implementación para Get<YourProperty>().

    Nota

    Este archivo se genera a partir de DslDefinition.dsl. Si edita este archivo, los cambios se perderán la próxima vez que seleccione Transformar todas las plantillas. En su lugar, agregue el método necesario en un archivo independiente.

  6. Cree o abra un archivo de clase en una carpeta independiente, por ejemplo CustomCode\<YourDomainClass>.cs.

    Asegúrese de que el espacio de nombres es el mismo que en el código generado.

  7. En el archivo de clase, escriba una implementación parcial de la clase de dominio. En la clase, escriba una definición para el método Get que falta que se parezca al siguiente ejemplo:

    namespace Company.FamilyTree
    {  
      public partial class Person
      {
        int GetAgeValue()
        {
          return System.DateTime.Today.Year - this.BirthYear;
        }
      }
    }
    
  8. Si establece Variante en Almacenamiento personalizado, también tiene que proporcionar un método Set. Por ejemplo:

    void SetAgeValue(int value)
    {
      if (!Store.InUndoRedoOrRollback) this.BirthYear = System.DateTime.Today.Year - value;
    }
    

    El código no debe establecer valores en el almacén cuando Store.InUndoRedoOrRollback es true. Consulte Transacciones y establecedores personalizados.

  9. Compile y ejecute la solución.

  10. Pruebe la propiedad. Asegúrese de probar Deshacer y rehacer.

Transacciones y establecedores personalizados

No es necesario abrir una transacción en el método set de la propiedad de almacenamiento personalizado. Normalmente, se llama al método dentro de una transacción activa.

Sin embargo, también se puede llamar al método setsi el usuario invoca Deshacer o Rehacer, o si se revierte una transacción. Cuando InUndoRedoOrRollback es true, el método set debe comportarse de la siguiente manera:

  • No debe realizar cambios en el almacén, como asignar valores a otras propiedades de dominio. El administrador de deshacer establece sus valores.

  • Sin embargo, debe actualizar los recursos externos, como el contenido de la base de datos o el archivo, u objetos fuera del almacén. Este enfoque se asegura de que se mantienen sincronizados con los valores del almacén.

    Por ejemplo:

    void SetAgeValue(int value)
    {
      // If we are in Undo, no changes to Store objects:
      if (!this.Store.InUndoRedoOrRollback)
      {
        this.BirthYear = System.DateTime.Today.Year - value;
      }
      // But always update external objects:
      System.IO.File.WriteAllText(AgeFile, value);
    }
    

Para obtener más información sobre las transacciones, consulte Navegación y actualización de un modelo en código de programa.