El archivo DslDefinition.dslThe DslDefinition.dsl File

Este tema describe la estructura del archivo DslDefinition.dsl en el proyecto de Dsl de un Domain-Specific Language ToolsDomain-Specific Language Tools solución, que define un lenguaje específico de dominio.This topic describes the structure of the DslDefinition.dsl file in the Dsl project of a Domain-Specific Language ToolsDomain-Specific Language Tools solution, which defines a domain-specific language. El archivo DslDefinition.dsl describe las clases y relaciones de un lenguaje específico de dominio, junto con el diagrama, formas, conectores y el formato de serialización, y cuadro de herramientas del lenguaje específico de dominio y su herramientas de edición.The DslDefinition.dsl file describes the classes and relationships of a domain-specific language, together with the diagram, shapes, connectors, serialization format, and Toolbox of the domain-specific language and its editing tools. En una solución de lenguaje específico de dominio, el código que define esas herramientas se genera conforme a la información del archivo DslDefinition.dsl.In a domain-specific language solution, the code that defines those tools is generated according to the information in the DslDefinition.dsl file.

Generalmente, se utiliza el Diseñador de lenguaje específico de dominio para editar el archivo DslDefinition.dsl.Generally, you use the Domain-Specific Language Designer to edit the DslDefinition.dsl file. Sin embargo, el formato sin procesar es XML por lo que puede abrir un archivo DslDefinition.dsl en un editor XML.However, its raw form is XML, and you can open a DslDefinition.dsl file in an XML editor. Para fines de depuración y extensión, quizás le resulte útil comprender qué información contiene el archivo y cómo está organizada.You might find it useful to understand what information the file contains and how it is organized for debugging and extension purposes.

Los ejemplos de este tema se toman de la plantilla de solución Diagrama de componentes.Examples in this topic are taken from the Component Diagram solution template. Para ver un ejemplo, cree una solución de lenguaje específico de dominio basada en la plantilla de solución Component Models (Modelos de componentes).To see an example, create a domain-specific language solution that is based on the Component Models solution template. Después de crear la solución, el archivo DslDefinition.dsl aparece en el diseñador de lenguaje específico de dominio.After you create the solution, the DslDefinition.dsl file appears in the Domain-Specific Language Designer. Cierre el archivo, haga clic en él en el Explorador de soluciones, seleccione abrir con, haga clic en Editor XMLy, a continuación, haga clic en Aceptar.Close the file, right-click it in Solution Explorer, point to Open With, click XML Editor, and then click OK.

Secciones del archivo DslDefinition.dslSections of the DslDefinition.dsl File

El elemento raíz es <Dsl > y sus atributos identifican el nombre del lenguaje específico de dominio, el espacio de nombres y números de versión principal y secundaria para el control de versiones.The root element is <Dsl>, and its attributes identify the name of the domain-specific language, the namespace, and major and minor version numbers for versioning. El esquema DslDefinitionModel define el contenido y la estructura de un archivo DslDefinition.dsl válido.The DslDefinitionModel schema defines the content and structure for a valid DslDefinition.dsl file.

Los elementos secundarios de la <Dsl > elemento raíz son los siguientes:The child elements of the <Dsl> root element are as follows:

ClasesClasses

En esta sección se define cada clase de dominio que genera una clase en el código generado.This section defines each domain class that generates a class in the generated code.

RelacionesRelationships

En esta sección se define cada relación del modelo.This section defines each relationship in the model. El origen y el destino representan los dos lados de una relación.The source and the target represent the two sides of a relationship.

TiposTypes

En esta sección se define cada tipo y su espacio de nombres.This section defines each type and its namespace. Las propiedades de dominio tienen dos tipos.Domain properties have two types. DomainEnumerations se definen en el modelo y generan tipos en DomainModel.cs.DomainEnumerations are defined in the model and generate types into DomainModel.cs. ExternalTypes hacen referencia a los tipos que se definen en otras partes (como String o Int32) y no generan nada.ExternalTypes refer to types that are defined elsewhere (such as String or Int32) and do not generate anything.

ShapesShapes

En esta sección se definen las formas que describen cómo aparece el modelo en un diseñador.This section defines the shapes that describe how the model appears in a designer. Estas formas geométricas se corresponden con las clases del modelo en la sección Diagrama.These geometric shapes are mapped to the classes in the model in the Diagram section.

ConectoresConnectors

En esta sección se define el aspecto de los conectores que aparecen en un diseñador.This section defines the appearance of the connectors that appear in a designer. Estas descripciones de estilos geométricos se corresponden con relaciones específicas del modelo en la sección Diagrama.These geometric style descriptions are mapped to specific relationships in the model in the Diagram section.

XmlSerializationBehaviorXmlSerializationBehavior

En esta sección se define un esquema de serialización y se proporciona información adicional sobre cómo se guarda cada clase en un archivo.This section defines a serialization scheme and provides additional information about how each class is saved to a file.

ExplorerBehaviorExplorerBehavior

Esta sección define cómo el DSL Explorer ventana aparece cuando el usuario está editando un modelo.This section defines how the DSL Explorer window appears when the user is editing a model.

ConnectionBuildersConnectionBuilders

En esta sección se define un generador de conexiones para cada herramienta de conector (la herramienta que se usa para crear vínculos entre dos clases cualquiera que se puedan conectar).This section defines a connection builder for each connector tool (the tool for making links between any two classes that can be connected). En esta sección se determina si se puede conectar una clase de origen y una de destino.This section determines whether you can connect a source and a target class.

DiagramDiagram

En esta sección se define un diagrama y se usa para especificar propiedades, como el color de fondo, y la clase raíz.This section defines a diagram, and you use it to specify properties such as background color and the root class. (La clase raíz es la clase de dominio que el diagrama representa como un todo). La sección Diagram también contiene elementos ShapeMap y ConnectorMap, que especifican la forma o el conector que representa cada clase o relación de dominio.(The root class is the domain class that is represented by the diagram as a whole.) The Diagram section also contains ShapeMap and ConnectorMap elements, which specify the shape or connector that represents each domain class or relationship.

DiseñadorDesigner

Esta sección define un diseñador (editor), que reúne un cuadro de herramientas, configuración de la validación, un diagrama y un esquema de serialización.This section defines a designer (editor), which brings together a Toolbox, validation settings, a diagram, and a serialization scheme. En la sección Designer también se define la clase raíz del modelo, que normalmente es también la clase raíz del diagrama.The Designer section also defines the root class of the model, which is usually also the root class of the diagram.

ExploradorExplorer

Esta sección se identifican los DSL explorador comportamiento (definido en la sección XmlSerializationBehavior).This section identifies the DSL Explorer behavior (defined in the XmlSerializationBehavior section).

Monikers en el archivo DslDefinition.dslMonikers in the DslDefinition.dsl file

En todo el archivo DslDefinition.dsl se pueden usar monikers para hacer referencias cruzadas a elementos específicos.Throughout the DslDefinition.dsl file, you can use monikers to make cross-references to specific items. Por ejemplo, cada definición Relationship contiene una subsección Source y una subsección Target.For example, each Relationship definition contains a Source subsection and a Target subsection. Cada subsección contiene el moniker de la clase de objeto que se puede vincular con esa relación:Each subsection contains the moniker of the class of object that can be linked with that relationship:

<DomainRelationship ...        Name="LibraryHasMembers" Namespace="ExampleNamespace" >    <Source>      <DomainRole ...>
       <RolePlayer>
         <DomainClassMoniker Name="Library" />
       </RolePlayer>
     </DomainRole>
   </Source>

Normalmente, el espacio de nombres del elemento referenciado (en este ejemplo, la clase de dominio Library) es el mismo que el del elemento referenciador (en este caso, la relación de dominio LibraryHasMembers).Usually, the namespace of the referenced item (in this example, the Library domain class) is the same as the referencing item (in this case, the LibraryHasMembers domain relationship). En estos casos, el moniker solo tiene que dar el nombre de la clase.In those cases, the moniker must give only the name of the class. De lo contrario, debe usar el formato completo /espacioDeNombres/Nombre:Otherwise, you should use the full form /Namespace/Name:

<DomainClassMoniker Name="/ExampleNameSpace/Library" />

El sistema de moniker requiere que los elementos del mismo nivel en el árbol XML tengan nombres distintos.The moniker system requires that siblings in the XML tree have distinct names. Por este motivo, se producen errores de validación si intenta guardar una definición específica de dominio que tenga, por ejemplo, dos clases con el mismo nombre.For this reason, validation errors occur if you try to save a domain-specific language definition that has, for example, two classes of the same name. Debe corregir siempre estos errores de nombres duplicados antes de guardar el archivo DslDefinition.dsl para que pueda volver a cargarlo correctamente más adelante.You should always correct such duplicate-name errors before you save the DslDefinition.dsl file so that you can reload it correctly later.

Cada tipo tiene su propio tipo de moniker: DomainClassMoniker, DomainRelationshipMoniker, y así sucesivamente.Each type has its own type of moniker: DomainClassMoniker, DomainRelationshipMoniker, and so on.

TiposTypes

En la sección Types se especifican todos los tipos que el archivo DslDefinition.dsl contiene como tipos de propiedades.The Types section specifies all the types that the DslDefinition.dsl file contains as types of properties. Estos tipos se dividen en dos tipos: tipos externos, por ejemplo, System.String y los tipos enumerados.These types fall into two kinds: external types, such as System.String, and enumerated types.

Tipos externosExternal Types

El ejemplo Component Diagram (Diagrama de componentes) muestra un conjunto de tipos primitivos estándar, aunque solo se usan algunos de ellos.The Component Diagram example lists a set of standard primitive types, although only some of them are used.

Cada definición de tipo externo consta de un nombre y un espacio de nombres, por ejemplo, String y System:Each External Type definition consists of just a name and a namespace, such as String and System:

<ExternalType Name="String" Namespace="System" />

Se usan los nombres completos de los tipos en lugar de palabras clave del compilador equivalentes, como "string".The full names of the types are used, instead of the equivalent compiler keywords such as "string".

Los tipos externos no se limitan a los tipos de la biblioteca estándar.External types are not restricted to standard library types.

EnumeracionesEnumerations

Una especificación de enumeración típica se parece a la de este ejemplo:A typical Enumeration specification resembles this example:

<DomainEnumeration IsFlags="true" Name="PageSort"          Namespace="Fabrikam.Wizard">
  <Literals>
    <EnumerationLiteral Name="Start" Value="1"/>
    <EnumerationLiteral Name="Decision" Value="2"/>
  </Literals>
</DomainEnumeration>

El atributo IsFlags controla si el atributo de Common Language Runtime (CLR) [Flags] asigna un prefijo al código generado, que determina si los valores de la enumeración se pueden combinar bit a bit.The IsFlags attribute controls whether the generated code is prefixed by the [Flags] Common Language Runtime (CLR) attribute, which determines whether values of the enumeration can be combined bitwise. Si este atributo se establece en True, debe especificar valores potencia de dos para los valores literales.If this attribute is set to true, you should specify power-of-two values for the literal values.

ClasesClasses

La mayoría de los elementos de cualquier definición de lenguaje específico de dominio son directa o indirectamente instancias de DomainClass.Most of the elements in any definition of a domain-specific language are either directly or indirectly instances of DomainClass. Las subclases de DomainClass incluyen DomainRelationship, Shape, Connector y Diagram.Subclasses of DomainClass include DomainRelationship, Shape, Connector, and Diagram. La sección Classes del archivo DslDefinition.dsl enumera las clases de dominio.The Classes section of the DslDefinition.dsl file lists the domain classes.

Cada clase tiene un conjunto de propiedades y podría tener una clase base.Each class has a set of properties and might have a base class. En el ejemplo Component Diagram (Diagrama de componentes), NamedElement es una clase abstracta que tiene una propiedad Name, cuyo tipo es String:In the Component Diagram example, NamedElement is an abstract class that has a Name property, whose type is string:

<DomainClass Id="ee3161ca-2818-42c8-b522-88f50fc72de8"  Name="NamedElement" Namespace="Fabrikam.CmptDsl5"      DisplayName="Named Element"  InheritanceModifier="Abstract">
  <Properties>
    <DomainProperty Id="ef553cf0-33b5-4e34-a30b-cfcfd86f2261"   Name="Name" DisplayName="Name"  DefaultValue="" Category="" IsElementName="true">
      <Type>
        <ExternalTypeMoniker Name="/System/String" />
      </Type>
    </DomainProperty>
  </Properties>
</DomainClass>

NamedElement es la base de varias de las demás clases, como Component, que tiene sus propias propiedades además de la propiedad Name, que heredó de NamedElement.NamedElement is the base of several of the other classes such as Component, which has its own properties in addition to the Name property, which it inherited from NamedElement. El nodo secundario BaseClass contiene una referencia de moniker.The BaseClass child node contains a moniker reference. Como la clase referenciada está en el mismo espacio de nombres, en el moniker solo se necesita su nombre.Because the referenced class is in the same namespace, only its name is required in the moniker:

<DomainClass Name="Component" Namespace="Fabrikam.CmptDsl5"              DisplayName="Component">
  <BaseClass>
    <DomainClassMoniker Name="NamedElement" />
  </BaseClass>
  <Properties>
    <DomainProperty Name="Kind" DisplayName="Kind" >
      <Type>
        <ExternalTypeMoniker Name="/System/String" />
      </Type>
    </DomainProperty>
  </Properties>

Todas las clases de dominio (incluidas relaciones, formas, conectores y diagramas) pueden tener estos atributos y nodos secundarios:Every domain class (including relationships, shapes, connectors, and diagrams) can have these attributes and child nodes:

  • Id. Este atributo es un GUID.Id. This attribute is a GUID. Si no proporciona un valor en el archivo, el diseñador de lenguaje específico de dominio creará un valor.If you do not provide a value in the file, the Domain-Specific Language Designer will create a value. (En las ilustraciones de este documento, este atributo se suele omitir para ahorrar espacio).(In illustrations in this document, this attribute is usually omitted to save space.)

  • Nombre y Namespace.Name and Namespace. Estos atributos especifican el nombre y espacio de nombres de la clase en el código generado.These attributes specify the name and namespace of the class in the generated code. Juntos deben ser únicos en el lenguaje específico de dominio.Together they must be unique within the domain-specific language.

  • InheritanceModifier.InheritanceModifier. Este atributo es "abstract", "sealed" o ninguno.This attribute is "abstract", "sealed", or none.

  • DisplayName.DisplayName. Este atributo es el nombre que aparece en el propiedades ventana.This attribute is the name that appears in the Properties window. El atributo DisplayName puede contener espacios y otros signos de puntuación.The DisplayName attribute can contain spaces and other punctuation.

  • GeneratesDoubleDerived.GeneratesDoubleDerived. Si este atributo se establece en true, se generan dos clases, y uno es una subclase del otro.If this attribute is set to true, two classes are generated, and one is a subclass of the other. Todos los métodos generados están en la clase base y los constructores están en la subclase.All the generated methods are in the base, and the constructors are in the subclass. Al establecer este atributo puede invalidar los métodos generados en el código personalizado.By setting this attribute, you can override any generated method in custom code.

  • HasCustomConstructor.HasCustomConstructor. Si este atributo se establece en True, el constructor se omite del código generado para que pueda escribir su propia versión.If this attribute is set to true, the constructor is omitted from the generated code so that you can write your own version.

  • Atributos.Attributes. Este atributo contiene los atributos de CLR de la clase generada.This attribute contains the CLR Attributes of the generated class.

  • BaseClass.BaseClass. Si especifica una clase base, debe ser del mismo tipo.If you specify a base class, it must be of the same type. Por ejemplo, una clase de dominio debe tener otra clase de dominio como base y una forma de compartimiento debe tener una forma de compartimiento.For example, a domain class must have another domain class as its base, and a compartment shape must have a compartment shape. Si no especifica una clase base, la clase del código generado deriva de una clase de marco estándar.If you do not specify a base class, the class in the generated code derives from a standard framework class. Por ejemplo, una clase de dominio deriva de ModelElement.For example, a domain class derives from ModelElement.

  • propiedades.Properties. Este atributo contiene las propiedades que se mantienen bajo el control de transacciones y se conservan cuando el modelo se guarda.This attribute contains the properties that are maintained under transaction control and persisted when the model is saved.

  • ElementMergeDirectives.ElementMergeDirectives. Cada directiva de combinación de elementos controla cómo se agrega una instancia diferente de otra clase a una instancia de la clase primaria.Each element merge directive controls how a different instance of another class is added to an instance of the parent class. Encontrará información más detallada sobre las directivas de combinación de elementos más adelante en este tema.You can find more detail about element merge directives later in this topic.

  • Se genera una clase de C# para cada clase de dominio enumerada en la sección Classes.A C# class is generated for each domain class that is listed in the Classes section. Las clases de C# se generan en Dsl\GeneratedCode\DomainClasses.cs.The C# classes are generated in Dsl\GeneratedCode\DomainClasses.cs.

PropiedadesProperties

Cada propiedad de dominio tiene un nombre y un tipo.Each domain property has a name and a type. El nombre debe ser único dentro de la clase de dominio y sus bases transitivas.The name must be unique within the domain class and its transitive bases.

El tipo debe ser uno de los que se enumeran en la sección Types.The type must refer to one of those listed in the Types section. Por lo general, el moniker debe incluir el espacio de nombres.Generally, the moniker must include the namespace.

<DomainProperty Name="Name" DisplayName="Name"  DefaultValue="" Category="" IsElementName="true">
  <Type>
    <ExternalTypeMoniker Name="/System/String" />
  </Type>
</DomainProperty>

Cada propiedad de dominio puede tener también estos atributos:Each domain property can also have these attributes:

  • IsBrowsable.IsBrowsable. Este atributo determina si la propiedad aparece en la propiedades ventana cuando el usuario hace clic en un objeto de la clase primaria.This attribute determines whether the property appears in the Properties window when the user clicks an object of the parent class.

  • IsUIReadOnly.IsUIReadOnly. Este atributo determina si el usuario puede cambiar la propiedad en el propiedades ventana o a través de un elemento decorator en el que se incluye la propiedad.This attribute determines whether the user can change the property in the Properties window or through a decorator in which the property is presented.

  • Tipo.Kind. Este atributo se puede establecer en Normal, Calculated o CustomStorage.You can set this attribute to Normal, Calculated, or CustomStorage. Si establece este atributo en Calculated, debe proporcionar código personalizado que determine el valor, y la propiedad será de solo lectura.If you set this attribute to Calculated, you must provide custom code that determines the value, and the property will be read-only. Si establece este atributo en CustomStorage, debe proporcionar código que obtenga y establezca los valores.If you set this attribute to CustomStorage, you must provide code that both gets and sets values.

  • IsElementName.IsElementName. Si este atributo se establece en True, su valor se establece automáticamente en un valor único cuando se crea una instancia de la clase primaria.If this attribute is set to true, its value is automatically set to a unique value when an instance of the parent class is created. Este atributo se puede establecer en True solo para una propiedad en cada clase, que debe tener un tipo String.This attribute can be set to true for only one property in each class, which must have a string type. En el ejemplo Component Diagram (Diagrama de componentes), la propiedad Name de NamedElement tiene IsElementName establecido en True.In the Component Diagram example, the Name property in NamedElement has IsElementName set to true. Siempre que un usuario crea un elemento Component (que hereda de NamedElement), el nombre se inicializa automáticamente en algo como "Component6".Whenever a user creates a Component element (which inherits from NamedElement), the name is automatically initialized to something like "Component6."

  • DefaultValue.DefaultValue. Si ha especificado este atributo, el valor que especificó se asigna a este atributo para las nuevas instancias de esta clase.If you have specified this attribute, the value that you specified is assigned to this attribute for new instances of this class. Si IsElementName está establecido, el atributo DefaultValue especifica la parte inicial de la nueva cadena.If IsElementName is set, the DefaultValue attribute specifies the initial part of the new string.

  • Categoría es el encabezado en la que la propiedad aparecerá en la propiedades ventana.Category is the header under which the property will appear in the Properties window.

RelacionesRelationships

La sección Relationships enumera todas las relaciones del lenguaje específico de dominio.The Relationships section lists all the relationships in the domain-specific language. Cada Domain Relationship es binaria y dirigida, y vincula miembros de una clase de origen con miembros de una clase de destino.Every Domain Relationship is binary and directed, linking members of a source class to members of a target class. Las clases de origen y de destino suelen ser clases de dominio, pero también se permiten relaciones con otras relaciones.The source and target classes are typically domain classes, but relationships to other relationships are also permitted.

Por ejemplo, la relación Connection vincula miembros de la clase OutPort con miembros de la clase InPort.For example, the Connection relationship links members of the OutPort class to members of the InPort class. Cada instancia de vínculo de la relación conecta una instancia de un OutPort con una instancia de un InPort.Each link instance of the relationship connects an instance of an OutPort to an instance of an InPort. Como la relación es de varios a varios, cada OutPort puede contener muchos vínculos Connection de los que es el origen, y cada instancia de InPort puede tener muchos vínculos Connection de los que es el destino.Because the relationship is many-many, each OutPort can have many Connection links with sources on it, and each InPort instance can have many Connection links that target it.

Roles de origen y destinoSource and target roles

Cada relación contiene roles de origen y de destino que tienen los siguientes atributos:Each relationship contains source and target roles that have the following attributes:

  • El RolePlayer atributo hace referencia a la clase de dominio de las instancias vinculadas: OutPort para el origen, InPort para el destino.The RolePlayer attribute references the domain class of the linked instances: OutPort for the source, InPort for the target.

  • El atributo Multiplicity tiene cuatro valores posibles (ZeroMany, ZeroOne, One y OneMany).The Multiplicity attribute has four possible values (ZeroMany, ZeroOne, One, and OneMany). Este atributo hace referencia al número de vínculos de esta relación que se pueden asociar con un encargado de rol.This attribute refers to the number of links of this relationship that can be associated with one role player.

  • El atributo PropertyName especifica el nombre que se usa en la clase encargada del rol para acceder a los objetos en el otro extremo.The PropertyName attribute specifies the name that is used in the role playing class to access the objects at the other end. Este nombre se usa en código de plantilla o personalizado para atravesar la relación.This name is used in template or custom code to traverse the relationship. Por ejemplo, el atributo PropertyName del rol de origen se establece en Targets.For example, the PropertyName attribute of the source role is set to Targets. Por consiguiente, el código siguiente funcionará:Therefore, the following code will work:

    OutPort op = ...; foreach (InPort ip in op.Targets) ...
    

    Por convención, los nombres de propiedad son plurales si la multiplicidad es ZeroMany o OneMany.By convention, property names are plural if the multiplicity is ZeroMany or OneMany.

    La multiplicidad de un rol hace referencia a cuántos roles opuestos se pueden asociar a cada instancia de este rol.The multiplicity of a role refers to how many of the opposite role can be associated with each instance of this role. Por ejemplo, en la relación ComponentHasPorts, el rol de destino tiene el atributo RolePlayer establecido en Port, el atributo PropertyName establecido en Component y el atributo Multiplicity establecido en ZeroOne.For example, in the relationship ComponentHasPorts, the target role has the RolePlayer attribute set to Port, the PropertyName attribute set to Component, and the Multiplicity attribute set to ZeroOne. Por lo tanto, el código apropiado para usar este rol es:Therefore, the appropriate code to use this role is:

    ComponentPort p = ...; Component c = p.Component; if (c != null) ...
    
  • El Name del rol es el nombre que se usa con la clase Relationship para hacer referencia a ese extremo de un vínculo.The role's Name is the name that is used within the Relationship class to refer to that end of a link. Por convención, un nombre de rol es siempre singular, porque cada vínculo solo tiene una instancia en cada extremo.By convention, a role name is always singular, because each link has only one instance at each end. El siguiente código funcionará:The following code would work:

    Connection connectionLink = ...; OutPort op = connectionLink.Source;
    
  • De forma predeterminada, el atributo IsPropertyGenerator está establecido en True.By default, the IsPropertyGenerator attribute is set to true. Si se establece en False, no se crea ninguna propiedad en la clase encargada del rol.If it is set to false, no property is created on the Role Player class. (En ese caso, op.Targets, por ejemplo, no funcionaría).(In that case, op.Targets, for example, would not work). Sin embargo, aún es posible usar código personalizado para atravesar la relación o para obtener acceso a los propios vínculos, si el código personalizado usa la relación explícitamente:However, it is still possible to use custom code to traverse the relationship or obtain access to the links themselves if the custom code uses the relationship explicitly:

    OutPort op = ...; foreach (InPort ip in Connection.GetTargets(op)) ...
    foreach (Connection link in Connection.GetLinksToTargets(op)) ...
    

Atributos de relaciónRelationship attributes

Además de los atributos y nodos secundarios de que disponen todas las clases, cada relación tiene estos atributos:In addition to the attributes and child nodes that are available to all classes, each relationship has these attributes:

  • IsEmbedding.IsEmbedding. Este atributo booleano especifica si la relación forma parte del árbol de incrustación.This Boolean attribute specifies whether the relationship is part of the embedding tree. Cada modelo debe formar un árbol con sus relaciones de incrustación.Every model must form a tree with its embedding relationships. Por lo tanto, cada clase de dominio debe ser el destino de, al menos, una relación de incrustación, a menos que sea la raíz del modelo.Every domain class must therefore be the target of at least one embedding relationship, unless it is the root of a model.

  • AllowsDuplicates.AllowsDuplicates. Este atributo booleano, cuyo valor es False de forma predeterminada, se aplica solo a relaciones que tienen una multiplicidad "Many" en el origen y el destino.This Boolean attribute, which is false by default, applies only to relationships that have a "many" multiplicity at both source and target. Determina si los usuarios del lenguaje pueden conectar un único par de elementos de origen y destino con más de un vínculo de la misma relación.It determines whether language users may connect a single pair of source and target elements by more than one link of the same relationship.

Pestañas del diseñador y del cuadro de herramientasDesigner and Toolbox Tabs

La parte principal de la diseñador sección del archivo DslDefinition.dsl es el ToolboxTab elementos.The main part of the Designer section of the DslDefinition.dsl file is the ToolboxTab elements. Un diseñador puede tener varios de estos elementos, cada uno de los cuales representa una sección con cabezal en el diseñador generado cuadro de herramientas.One designer can have several of these elements, each of which represents a headed section in the generated designer's Toolbox. Cada ToolboxTab elemento puede contener uno o varios ElementTool elementos, ConnectionTool elementos, o ambos.Each ToolboxTab element can contain one or more ElementTool elements, ConnectionTool elements, or both.

Las herramientas de elemento pueden crear instancias de una clase de dominio específica.Element tools can create instances of a specific domain class. Cuando el usuario arrastra una herramienta de elemento al diagrama, el resultado está determinado por las directivas de combinación de elementos, tal y como se describe en la sección sobre las directivas de combinación de elementos más adelante en este tema.When the user drags an element tool onto the diagram, the result is determined by element merge directives as described in the section about element merge directives later in this topic.

Cada herramienta de conexión puede invocar un generador de conexiones específico.Each connection tool can invoke a specific connection builder. Un generador de conexiones puede crear más de un tipo de relación, según dónde el usuario haga clic con el mouse, tal y como se describe en la sección sobre generadores de conexiones.One connection builder can create more than one type of relationship, depending on where the user clicks the mouse, as described in the section about connection builders.

Ninguno de los tipos de herramienta construye directamente formas o conectores.Neither type of tool directly constructs shapes or connectors. Cada uno crea una instancia de una clase de dominio o una relación de dominio; después, las asignaciones de formas y conectores determinan cómo se muestra esa relación de dominio o clase de dominio.Each instantiates a domain class or a domain relationship; the Shape and Connector mappings then determine how that domain class or domain relationship appears.

RutasPaths

Las rutas de dominio aparecen en varios lugares del archivo DslDefinition.dsl.Domain paths appear in several locations in the DslDefinition.dsl file. Estas rutas especifican una serie de vínculos desde un elemento del modelo (es decir, una instancia del lenguaje específico de dominio) a otro.These paths specify a series of links from one element in a model (that is, an instance of the domain-specific language) to another. La sintaxis de la ruta es simple pero detallada.Path syntax is simple but verbose.

Las rutas aparecen en el archivo DslDefinition.dsl en las etiquetas <DomainPath>...</DomainPath>.Paths appear in the DslDefinition.dsl file in <DomainPath>...</DomainPath> tags. Aunque las rutas pueden navegar por varios vínculos, en la mayoría de los ejemplos solo atraviesan un vínculo.Although paths can navigate through multiple links, most examples in practice traverse only one link.

Una ruta está compuesta por una secuencia de segmentos.A path consists of a sequence of segments. Cada segmento es un salto desde un objeto a un vínculo o desde un vínculo a un objeto.Each segment is a hop either from an object to a link or from a link to an object. Por lo tanto, los saltos suelen alternarse en una ruta larga.Therefore, the hops typically alternate in a long path. El primer salto se realiza desde un objeto a un vínculo, el segundo salto desde el objeto al otro extremo del vínculo, el tercer salto hacia el siguiente vínculo, etc.The first hop is from an object to a link, the second hop is to the object at the other end of the link, the third hop is to the next link, and so on. La excepción ocasional a esta secuencia es cuando una relación es ella misma el origen o el destino de otra relación.The occasional exception to this sequence is where a relationship is itself the source or target of another relationship.

Cada segmento comienza por un nombre de relación.Each segment starts with a relationship name. En un vínculo de objeto de salto, precede a la relación de un punto y el nombre de propiedad: "Relationship . Property".In an object-to-link hop, the relationship precedes a dot and the property name: "Relationship . Property". En un salto del objeto de vínculo, la relación precede a una marca de exclamación y el nombre de rol: "Relationship ! Role".In a link-to-object hop, the relationship precedes an exclamation mark and the role name: "Relationship ! Role".

El ejemplo Component Diagram (Diagrama de componentes) contiene una ruta en la ParentElementPath del ShapeMap para InPort.The Component Diagram example contains a path in the ParentElementPath of the ShapeMap for InPort. Esta ruta comienza de la siguiente manera:This path starts as follows:

    ComponentHasPorts.Component

En este ejemplo, InPort es una subclase de ComponentPort y tiene una relación ComponentHasPorts.In this example, InPort is a subclass of ComponentPort and has a relationship ComponentHasPorts. La propiedad se llama Component.The property is called Component.

Al escribir C# en este modelo, puede acceder directamente a través de un vínculo en un solo paso mediante la propiedad que genera la relación en cada una de las clases que se relaciona con:When writing C# against this model, you can jump across a link in one step by using the property that the relationship generates on each of the classes that it relates:

     InPort port; ...  Component c = port.Component;

Sin embargo, debe hacer ambos saltos explícitamente en la sintaxis de la ruta.However, you must do both hops explicitly in Path Syntax. Este requisito permite acceder al vínculo intermedio más fácilmente.Because of this requirement, you can access the intermediate link more easily. El código siguiente completa el salto desde el vínculo al Component:The following code completes the hop from the link to the Component:

    ComponentHasPorts.Component / ! Component

(Puede omitir el nombre de la relación cuando sea igual que en el segmento anterior).(You can omit the relationship name where it is the same as in the previous segment.)

Directivas de combinación de elementosElement Merge Directives

Cuando el usuario de lenguaje arrastra un elemento de la cuadro de herramientas en el diagrama, se crea una instancia de clase de la herramienta.When the language user drags an item from the Toolbox onto the diagram, an instance of the tool's class is constructed. Además, se crean vínculos entre esa instancia y los elementos de modelo existentes.Also, links are made between that instance and the existing model elements. Algunos elementos, como componentes o los comentarios, se crean cuando el usuario de idioma arrastra desde el cuadro de herramientas en una parte en blanco del diagrama.Some items, such as components or comments, are created when the language user drags them from the Toolbox onto a blank part of the diagram. Otros elementos se crean cuando el usuario del lenguaje los arrastra a otros elementos de host.Other items are created when the language user drags them onto other host elements. Por ejemplo, se crea un OutPort o un InPort cuando el usuario del lenguaje lo arrastra a un componente.For example, an OutPort or InPort is created when the language user drags it onto a component.

Una posible clase host, como Component, aceptará un nuevo elemento solo si la clase host tiene una directiva de combinación de elementos para la clase del nuevo elemento.A potential host class, such as Component, will accept a new element only if the host class has an element merge directive for the class of the new element. Por ejemplo, el nodo DomainClass con Name="Component" contiene:For example, the DomainClass node with Name="Component" contains:

<DomainClass Name="Component" ...> ...
    <ElementMergeDirective>
      <Index>
        <DomainClassMoniker Name="ComponentPort" />
      </Index>
      <LinkCreationPaths>
        <DomainPath>ComponentHasPorts.Ports</DomainPath>
      </LinkCreationPaths>
    </ElementMergeDirective> ...

El moniker de clase que está bajo el nodo Index hace referencia a la clase de elemento que se puede aceptar.The class moniker that is under the Index node references the class of element that can be accepted. En este caso, ComponentPort es la clase base abstracta de InPort y OutPort.In this case, ComponentPort is the abstract base class of InPort and OutPort. Por lo tanto, se aceptará cualquiera de estos elementos.Therefore, either of those elements can be accepted.

ComponentModel, la clase raíz del lenguaje, tiene directivas de combinación de elementos para componentes y comentarios.ComponentModel, the root class of the language, has element merge directives for components and comments. El usuario del lenguaje puede arrastrar elementos para esas clases directamente en el diagrama porque las partes en blanco del diagrama representan la clase raíz.The language user can drag items for those classes directly onto the diagram because the blank parts of the diagram represent the root class. Sin embargo, ComponentModel no tiene ninguna directiva de combinación de elementos para ComponentPort.However, ComponentModel has no element merge directive for ComponentPort. Por lo tanto, el usuario del lenguaje no puede arrastrar OutPorts o InPorts directamente al diagrama.Therefore, the language user cannot drag InPorts or OutPorts directly onto the diagram.

La directiva de combinación de elementos determina qué vínculo o vínculos se crean para que el nuevo elemento se pueda integrar o combinar en el modelo existente.The element merge directive determines what link or links are created so that the new element can integrate or merge into the existing model. Para un ComponentPort, se crea una instancia de ComponentHasPorts.For a ComponentPort, an instance of ComponentHasPorts is created. DomainPath identifica tanto la relación como la propiedad de la clase primaria, Ports, a la que se agregará el nuevo elemento.The DomainPath identifies both the relationship and the property of the parent class, Ports, to which the new element will be added.

Puede crear más de un vínculo en una directiva de combinación de elementos, incluyendo más de una ruta de creación de vínculo.You can create more than one link on an element merge directive by including more than one link creation path. Una de las rutas debe estar incrustada.One of the paths must be embedded.

Puede usar más de un segmento en una ruta de creación de vínculo.You can use more than one segment in a link creation path. En este caso, el último segmento define qué vínculo se debe crear.In this case, the last segment defines what link must be created. Los primeros segmentos navegan desde la clase primaria al objeto desde el cual se debe crear el nuevo vínculo.The earlier segments navigate from the parent class to the object from which the new link should be created.

Por ejemplo, puede agregar esta directiva de combinación de elementos a la clase Component:For example, you can add this element merge directive to the Component class:

<DomainClass Name="Component" ...> ...
  <ElementMergeDirective>
    <Index>
       <DomainClassMoniker Name="Comment"/>
    </Index>
    <LinkCreationPaths>
       <DomainPath>          ComponentModelHasComponents . ComponentModel / !ComponentModel         / ComponentModelHasComments.Comments       </DomainPath>
       <DomainPath>CommentsReferenceComponents.Comments</DomainPath>
    </LinkCreationPaths>
  </ElementMergeDirective>

Después, los usuarios del lenguaje pueden arrastrar un comentario a un componente y hacer que el nuevo comentario se cree automáticamente con un vínculo al componente.Language users can then drag a comment onto a component and have the new comment automatically created with a link to the component.

La primera ruta de creación de vínculo navega desde Component a ComponentModel y, después, crea una instancia de la relación de incrustación ComponentModelHasComments.The first link creation path navigates from the Component to the ComponentModel and then creates an instance of the embedding relationship ComponentModelHasComments. La segunda ruta de creación de vínculo crea un vínculo de la relación de referencia CommentsReferenceComponents desde el Component host al nuevo Comment.The second link creation path creates a link of the reference relationship CommentsReferenceComponents from the host Component to the new Comment. Todas las rutas de creación de vínculo deben comenzar con la clase host y deben terminar en un vínculo que avance a la clase cuya instancia se acaba de crear.All link creation paths must start with the host class and must end at a link that steps towards the newly instantiated class.

XmlClassDataXmlClassData

Cada clase de dominio (incluidas las relaciones y otros subtipos) pueden proporcionar información adicional en un nodo XmlClassData, que aparece en la sección XmlSerializationBehavior del archivo DslDefinition.dsl.Each domain class (including relationships and other subtypes) can have extra information provided in an XmlClassData node, which appears under the XmlSerializationBehavior section of the DslDefinition.dsl file. Esta información define específicamente cómo se almacenan las instancias de la clase de forma serializada cuando se guarda un modelo en un archivo.This information specifically concerns how instances of the class are stored in serialized form when a model is saved to a file.

Gran parte del código generado al que XmlSerializationBehavior afecta está en Dsl\GeneratedCode\Serializer.cs.Much of the generated code that XmlSerializationBehavior influences is in Dsl\GeneratedCode\Serializer.cs.

Cada nodo XmlClassData incluye estos nodos secundarios y atributos:Each XmlClassData node includes these child nodes and attributes:

  • Un nodo moniker, que hace referencia a la clase a la que se aplican los datos.A moniker node, which references the class to which the data applies.

  • XmlPropertyData para cada propiedad que se define en la clase.XmlPropertyData for each property that is defined on the class.

  • XmlRelationshipData para cada relación que se ha originado en la clase.XmlRelationshipData for each relationship that is sourced at the class. (Las relaciones también tienen sus propios nodos XmlClassData).(Relationships also have their own XmlClassData nodes.)

  • TypeName atributo de cadena, que determina el nombre de la clase de aplicación auxiliar de serialización en el código generado.TypeName string attribute, which determines the name of the serialization helper class in the generated code.

  • ElementName cadena, que determina la etiqueta XML de las instancias serializadas de esta clase.ElementName string, which determines the XML tag of serialized instances of this class. Por convención, ElementName suele ser igual que el nombre de la clase, excepto que la primera letra es minúscula.By convention, ElementName is usually the same as the class name except the first letter is lowercase. Por ejemplo, un archivo de modelo de muestra comienza con lo siguiente:For example, a sample model file starts with the following:

    <componentModel ...
    
  • MonikerElementName en los archivos de usuario modelo serializado.MonikerElementName in the user's serialized model files. Este atributo incorpora un moniker que hace referencia a esta clase.This attribute introduces a moniker that references this class.

  • MonikerAttributeName, que identifica el nombre del atributo XML dentro de un moniker.MonikerAttributeName, which identifies the name of the XML attribute within a moniker. En este fragmento de archivo serializado de un usuario, el autor del lenguaje específico de dominio definido MonikerElementName como "inPortMoniker" y MonikerAttributeName como "path":In this fragment of a user's serialized file, the author of the domain-specific language defined MonikerElementName as "inPortMoniker" and MonikerAttributeName as "path":

    <inPortMoniker path="//Component2/InPort1" />
    

ConnectionBuildersConnectionBuilders

Para cada herramienta de conexión se define un generador de conexiones.A connection builder is defined for each connection tool. Cada generador de conexiones consta de uno o varios elementos LinkConnectDirective, cada uno de los cuales contiene uno o varios elementos SourceDirective y uno o varios elementos TargetDirective.Each connection builder consists of one or more LinkConnectDirective elements, each of which contains one or more SourceDirective elements and one or more TargetDirective elements. Después de hacer clic en la herramienta de conexión, el usuario puede iniciar una conexión desde cualquier forma asignada a un elemento de modelo que aparezca en la lista de elementos SourceDirective.After clicking a connection tool, the user can start a connection from any shape mapped to a model element that appears in the list of SourceDirective elements. Después, la conexión se puede completar en una forma asignada a un elemento que aparezca en la lista de elementos TargetDirective.The connection can then be completed on a shape that is mapped to an element that appears in the list of TargetDirective elements. La clase de relación de la cual se crea una instancia dependerá del elemento LinkConnectDirective designado por el lugar donde se inició la conexión.The class of relationship instantiated depends on the LinkConnectDirective element designated by where the connection was started.

XmlPropertyDataXmlPropertyData

A DomainPropertyMoniker atributo identifica la propiedad al que hace referencia los datos.A DomainPropertyMoniker attribute identifies the property to which the data refers. Este atributo debe ser una propiedad de la clase de ClassData contenedora.This attribute must be a property of the enclosing ClassData's class.

El XmlName atributo proporciona el nombre de atributo correspondiente, tal como debe aparecer en el archivo XML.The XmlName attribute gives the corresponding attribute name as it should appear in the XML. Por convención, esta cadena es igual que el nombre de la propiedad, excepto que la primera letra es minúscula.By convention, this string is the same as the property name except the first letter is lowercase.

De forma predeterminada, el representación atributo está establecido en el atributo.By default, the Representation attribute is set to Attribute. Si representación se establece en el elemento, un elemento secundario se crea el nodo en el archivo XML.If Representation is set to Element, a child node is created in the XML. Si representación está establecido en Omitir, la propiedad no está serializada.If Representation is set to Ignore, the property is not serialized.

El IsMonikerKey y IsMonikerQualifier atributos a una propiedad de un rol para identificar las instancias de la clase primaria.The IsMonikerKey and IsMonikerQualifier attributes give a property a role in identifying instances of the parent class. Puede establecer IsMonikerKey en true para una propiedad que está definida en o heredada por una clase.You can set IsMonikerKey to true for one property that is defined in or inherited by a class. Este atributo identifica una instancia individual de la clase primaria.This attribute identifies an individual instance of the parent class. La propiedad que establece en IsMonikerKey suele ser un nombre u otro identificador clave.The property that you set to IsMonikerKey is usually a name or other key identifier. Por ejemplo, la propiedad de cadena Name es la clave de moniker de NamedElement y sus clases derivadas.For example, the Name string property is the moniker key for NamedElement and its derived classes. Cuando el usuario guarda un modelo en un archivo, este atributo debe contener valores únicos para cada instancia, entre sus elementos del mismo nivel en el árbol de relaciones de incrustación.When the user saves a model to file, this attribute must contain unique values for each instance, among its siblings in the tree of embedding relationships.

En el archivo de modelo serializado, el moniker completo de un elemento es una ruta desde la raíz del modelo hacia abajo en el árbol de relaciones de incrustación, y cita la clave de moniker en cada punto.In the serialized model file, the full moniker of an element is a path from the model root down the tree of embedding relationships, quoting the moniker key at each point. Por ejemplo, InPorts se incrustan en Components que, a su vez, se incrustan en la raíz del modelo.For example, InPorts are embedded within Components, which are in turn embedded in the model root. Por lo tanto, un moniker válido es:A valid moniker is therefore:

<inPortMoniker name="//Component2/InPort1" />

Puede establecer la IsMonikerQualifier de atributo para una propiedad de cadena y proporcionan un método adicional para construir el nombre completo de un elemento.You can set the IsMonikerQualifier attribute for a string property and provide an additional way to construct the full name of an element. Por ejemplo, en el archivo DslDefinition.dsl, Namespace es un calificador de moniker.For example, in the DslDefinition.dsl file, Namespace is a moniker qualifier.

XmlRelationshipDataXmlRelationshipData

Dentro de un archivo de modelo serializado, los vínculos (tanto de relaciones de incrustación como de referencia) se representan mediante nodos secundarios del extremo de origen de la relación.Within a serialized model file, links (of both embedding and reference relationships) are represented by child nodes of the source end of the relationship. En el caso de las relaciones de incrustación, el nodo secundario contiene un subárbol.For embedding relationships, the child node contains a subtree. En las relaciones de referencia, el nodo secundario contiene un moniker que hace referencia a otra parte del árbol.For reference relationships, the child node contains a moniker that references another part of the tree.

El XmlRelationshipData de atributo en un XmlClassData atributo define exactamente cómo los nodos secundarios están anidados dentro del elemento de origen.The XmlRelationshipData attribute in an XmlClassData attribute defines exactly how the child nodes are nested within the source element. Todas las relaciones que son un origen de la clase de dominio tiene un XmlRelationshipData atributo.Every relationship that is a source on the Domain Class has one XmlRelationshipData attribute.

El DomainRelationshipMoniker atributo identifica una de las relaciones con origen en la clase.The DomainRelationshipMoniker attribute identifies one of the relationships sourced on the class.

El RoleElementName atributo proporciona el nombre de etiqueta XML que incluye el nodo secundario en los datos serializados.The RoleElementName attribute gives the XML tag name that encloses the child node in the serialized data.

Por ejemplo, el archivo DslDefinition.dsl contiene:For example, the DslDefinition.dsl file contains:

<XmlClassData ElementName="component" ...>
  <DomainClassMoniker Name="Component" />
  <ElementData>
    <XmlRelationshipData RoleElementName="ports">
      <DomainRelationshipMoniker Name="ComponentHasPorts" />
    </XmlRelationshipData>

Por lo tanto, el archivo serializado contiene:Therefore, the serialized file contains:

<component name="Component1"> <!-- parent ->
   <ports> <!-- role ->
     <outPort name="OutPort1"> <!-- child element ->
       ...
     </outPort>
   </ports> ...

Si el UseFullForm atributo está establecido en true, se introduce un nivel adicional de anidamiento.If the UseFullForm attribute is set to true, an extra layer of nesting is introduced. Este nivel representa la propia relación.This layer represents the relationship itself. El atributo se debe establecer en True si la relación tiene propiedades.The attribute must be set to true if the relationship has properties.

<XmlClassData ElementName="outPort">
   <DomainClassMoniker Name="OutPort" />
   <ElementData>
     <XmlRelationshipData UseFullForm="true" RoleElementName="targets">
       <DomainRelationshipMoniker Name="Connection" />
     </XmlRelationshipData>
   </ElementData>
 </XmlClassData>

El archivo serializado contiene:The serialized file contains:

<outPort name="OutPort1">  <!-- Parent ->
   <targets>  <!-- role ->
     <connection sourceRoleName="X">  <!-- relationship link ->
         <inPortMoniker name="//Component2/InPort1" /> <!-- child ->
     </connection>
    </targets>
  </outPort>

(La relación de conexión tiene su propios datos de clase XML, que proporcionan los nombres de elementos y atributos).(The Connection Relationship has its own XML class data, which provides its element and attribute names.)

Si el OmitElement atributo está establecido en true, la relación se omite el nombre de la función, que abrevia archivo serializado y no es ambiguo si dispone de las dos clases no más de una relación.If the OmitElement attribute is set to true, the relationship role name is omitted, which abbreviates the serialized file and is unambiguous if the two classes have no more than one relationship. Por ejemplo:For example:

<component name="Component3">
  <!-- only one relationship could get here: ->
  <outPort name="OutPort1">
     <targets> ...

Serialización de una definición de lenguaje específico de dominioSerialization of a Domain-Specific Language Definition

El archivo DslDefinition.dsl es un archivo serializado conforme a la definición de lenguaje específico de dominio.The DslDefinition.dsl file is itself a serialized file and conforms to a domain-specific language definition. Los siguientes son algunos ejemplos de definiciones de serialización XML:The following are some examples of XML serialization definitions:

  • DSL es el nodo RootClass y la clase del diagrama.Dsl is the RootClass node and the class of the diagram. DomainClass, DomainRelationship y otros elementos están incrustados en Dsl.DomainClass, DomainRelationship, and other elements are embedded under Dsl.

  • Clases de es el RoleElementName de la relación entre el lenguaje específico de dominio y DomainClass.Classes is the RoleElementName of the relationship between Domain-Specific Language and DomainClass.

<Dsl Name="CmptDsl5" ...>
  <Classes>
    <DomainClass Name="NamedElement" InheritanceModifier="Abstract" ...
  • El XmlSerializationBehavior atributo está incrustado en el Dsl atributo, pero la OmitElement se ha establecido el atributo en la relación de incrustación.The XmlSerializationBehavior attribute is embedded under the Dsl attribute, but the OmitElement attribute has been set on the embedding relationship. Por lo tanto, no interviene ningún atributo RoleElementName.Therefore, no RoleElementName attribute intervenes. Por el contrario, un datos de clase atributo es el RoleElementName atributo de la relación entre incrustar un XmlSerializationBehavior atributo y un XmlClassData atributo.By contrast, a ClassData attribute is the RoleElementName attribute of the embedding relationship between an XmlSerializationBehavior attribute and an XmlClassData attribute.
<Dsl Name="CmptDsl5" ...> ...
  <XmlSerializationBehavior Name="ComponentsSerializationBehavior" >
    <ClassData>
      <XmlClassData ...>...</XmlClassData>
      <XmlClassData ...>...</XmlClassData>
  • ConnectorHasDecorators es la relación de incrustación entre Connector y Decorator.ConnectorHasDecorators is the embedding relationship between Connector and Decorator. UseFullForm se ha establecido de manera que el nombre de la relación aparezca con su lista de propiedades para cada vínculo desde el objeto Connector.UseFullForm has been set so that the name of the relationship appears with its list of properties for each link from the Connector object. Sin embargo, OmitElement también se ha establecido para ningún RoleElementName contenga varios vínculos que están incrustados dentro de Connector:However, OmitElement has also been set so that no RoleElementName encloses the multiple links that are embedded inside Connector:
<Connector Name="AssociationLink" ...>
  <ConnectorHasDecorators Position="TargetTop" ...>
    <TextDecorator Name="TargetRoleName"   />
  </ConnectorHasDecorators>
  <ConnectorHasDecorators Position="SourceTop" ...>
    <TextDecorator Name="SourceRoleName"   />
  </ConnectorHasDecorators>
</Connector>

Formas y conectoresShapes and Connectors

Las definiciones de formas y conectores heredan los atributos y nodos secundarios de las clases de dominio, además de lo siguiente:Shape and Connector definitions inherit attributes and child nodes from domain classes, in addition to the following:

  • Atributos Color y Line``Style.Color and Line``Style attributes.

  • ExposesFillColorAsProperty y varios atributos similares.ExposesFillColorAsProperty and several similar attributes. Estos atributos booleanos hacen que la propiedad correspondiente sea variable para el usuario.These Boolean attributes make the corresponding property variable by the user. Por lo general, cuando un usuario de idioma, haga clic en una forma del diagrama, las propiedades que aparecen en la propiedades ventana son las de la instancia de la clase de dominio al que está asignada la forma.Generally, when a language user clicks a shape on the diagram, the properties that appear in the Properties window are those of the domain class instance to which the shape is mapped. Si ExposesFillColorAsProperty se establece en True, también se muestra una propiedad de la propia forma.If ExposesFillColorAsProperty is set to true, a property of the shape itself also appears.

  • ShapeHasDecorators.ShapeHasDecorators. Se crea una instancia de este atributo para cada texto, icono o elemento Decorator de expansión/contracción.An instance of this attribute occurs for each text, icon, or expand/collapse decorator. (En el archivo DslDefinition.dsl, ShapeHasDecorators es una relación con UseFullForm establecido en True).(In the DslDefinition.dsl file, ShapeHasDecorators is a relationship with UseFullForm set to true.)

Asignaciones de formasShape Maps

Las asignaciones de formas determinan cómo se muestran en pantalla las instancias de una clase de dominio determinada, representadas por una forma.Shape maps determine how instances of a given domain class appear on the screen, represented by a shape. Las asignaciones de formas y conectores aparecen en la sección Diagram del archivo DslDefinition.dsl.Both shape and connector maps appear under the Diagram section of the DslDefinition.dsl file.

Al igual que en el ejemplo siguiente, los elementos ShapeMap tienen, como mínimo, el moniker de una clase de dominio, el moniker de una forma y un elemento ParentElementPath:As in the following example, the ShapeMap elements have, at a minimum, the moniker of a domain class, the moniker of a shape, and a ParentElementPath element:

<ShapeMap>
  <DomainClassMoniker Name="InPort" />
  <ParentElementPath>
    <DomainPath>ComponentHasPorts.Component/!Component</DomainPath>
  </ParentElementPath>
  <PortMoniker Name="InPortShape" />
</ShapeMap>

La función principal del elemento ParentElementPath es que la misma clase de objetos pueda aparecer como formas diferentes en contextos diferentes.The primary function of the ParentElementPath element is so that the same class of objects can appear as a different shape in different contexts. Por ejemplo, si un InPort también se puede incrustar en un comentario, el InPort podría aparecer como una forma diferente con esa finalidad.For example, if an InPort could also be embedded in a comment, the InPort could appear as a different shape for that purpose.

En segundo lugar, la ruta determina cómo se relaciona la forma con su primaria.Secondly, the path determines how the shape relates to its parent. Entre las formas de un archivo DslDefinition.dsl no se define ninguna estructura de incrustación.No embedding structure is defined between the shapes in a DslDefinition.dsl file. Debe inferir la estructura a partir de las asignaciones de formas.You must infer the structure from the shape maps. La forma primaria de una forma es aquélla que está asignada al elemento de dominio que la ruta del elemento primario identifica.The parent of a shape is the shape that is mapped to the domain element that the parent element path identifies. En este caso, la ruta identifica el componente al que pertenece el InPort.In this case, the path identifies the component to which the InPort belongs. En otra asignación de forma, la clase Component está asignada a ComponentShape.In another shape map, the Component class is mapped to ComponentShape. Por lo tanto, la nueva forma InPort se convierte en forma secundaria de la clase ComponentShape de su componente.Therefore, the new InPort shape is made a child shape of its component's ComponentShape.

En cambio, si asoció la forma InPort al diagrama, la ruta del elemento primario tendría que realizar otro paso, al modelo de componentes, que se asigna al diagrama:If you attached the InPort shape to the diagram instead, the parent element path would have to take another step, to the component model, which is mapped to the diagram:

ComponentHasPorts . Component / ! Component /    ComponentModelHasComponents . ComponentModel / ! ComponentModel

La raíz del modelo no tiene una asignación de formas.The root of the model does not have a shape map. En su lugar, la raíz es referenciada directamente por el diagrama, que tiene un elemento Class:Instead, the root is referenced directly from the diagram, which has a Class element:

<Diagram Name="ComponentDiagram" >
    <Class>
      <DomainClassMoniker Name="ComponentModel" />
    </Class>...

Asignaciones de elementos DecoratorDecorator Maps

Una asignación de elemento Decorator asocia una propiedad de la clase asignada a un elemento Decorator en la forma.A decorator map associates a property in the mapped class to a decorator on the shape. Si la propiedad es de un tipo booleano o enumerado, su valor puede determinar si el elemento Decorator es visible.If the property is an enumerated or Boolean type, its value can determine whether the decorator is visible. Si el elemento Decorator es de texto, el valor de la propiedad puede aparecer y el usuario puede editarla.If the decorator is a text decorator, the value of the property can appear, and the user can edit it.

Asignaciones de formas de compartimientoCompartment Shape Maps

Las asignaciones de formas de compartimiento son subtipos de las asignaciones de formas.Compartment shape maps are subtypes of shape maps.

Asignaciones de conectoresConnector Maps

La asignación de conector mínima hace referencia a un conector y a una relación:The minimal connector map references a connector and a relationship:

<ConnectorMap>
  <ConnectorMoniker Name="CommentLink" />
  <DomainRelationshipMoniker Name="CommentsReferenceComponents" />
</ConnectorMap>

Las asignaciones de conectores también pueden contener asignaciones de elementos Decorator.Connector maps can also contain decorator maps.

Vea tambiénSee also