Cómo: Navegar por las relaciones con la API de UML
En Visual Studio Ultimate, un modelo se compone de elementos vinculados entre sí mediante diferentes tipos de relaciones.En este tema se describe cómo navegar por el modelo en código de programa.
Recorrer las relaciones
Cualquier relación
Utilice GetRelatedElements<T>() para buscar todos los elementos conectados a un elemento especificado.Establezca T en IRelationship para recorrer las relaciones de todo tipo o utilice un tipo más específico, como IAssociation, para recorrer exclusivamente ese tipo.
IElement anElement;
// Select all elements related to anElement.
Context.CurrentDiagram.SelectShapes (
anElement.GetRelatedElements<IRelationship>()
.SelectMany(e=>e.Shapes()).ToArray());
Use GetRelatedLinks<T>() para buscar todas las relaciones conectadas a un elemento.
// Process all relationships connected to an element.
foreach (IRelationship relationship in
anElement.GetRelatedLinks<IRelationship>())
{
Debug.Assert(relationship.SourceElement == anElement
|| relationship.TargetElement == anElement);
}
Asociación
Una asociación es una relación entre dos propiedades, cada una de los cuales pertenece a un clasificador.
IClassifier classifier; // class, interface, component, actor, ...
// Get all the associations sourced from this classifier
foreach (IProperty p in classifier.GetOutgoingAssociationEnds())
{
// p represents the end further end of an association.
IType oppositeElement = p.Type;
// The type to which this association connects classifier
IProperty oppositeProperty = p.Opposite;
// The nearer end of the association.
Debug.Assert(oppositeProperty.Type == classifier);
IAssociation association = p.Association;
Debug.Assert(association.MemberEnds.Contains(p)
&& association.MemberEnds.Contains(oppositeProperty));
}
Generalización y realización
Tiene acceso a los extremos opuestos de la generalización:
foreach (IClassifier supertype in classifier.Generals) {…}
foreach (IClassifier subtype in classifier.GetSpecifics()) {…}
Access the relationship itself:
foreach (IGeneralization gen in classifier.Generalizations)
{ Debug.Assert(classifier == gen.Specific); }
/// InterfaceRealization:
IEnumerable<IInterface> GetRealizedInterfaces
(this IBehavioredClassifier classifier);
IEnumerable<IBehavioredClassifier> GetRealizingClassifiers
(this IInterface interface);
Dependencia
/// Returns the elements depending on this element
IEnumerable<INamedElement> GetDependencyClients(this INamedElement element);
/// Returns the elements this element depends on
IEnumerable<INamedElement> INamedElement GetDependencySuppliers(this INamedElement element);
Perímetro de actividad
/// Returns the nodes targeted by edges outgoing from this one
IEnumerable<IActivityNode> GetActivityEdgeTargets(this IActivityNode node);
/// Returns the nodes sourcing edges incoming to this one
IEnumerable<IActivityNode> GetActivityEdgeSources(this IActivityNode node);
Conector (ensamblado y delegación)
/// Returns the elements connected via assembly
/// or delegation to this one
IEnumerable<IConnectableElement> GetConnectedElements(this IConnectableElement element);
Mensajes y líneas de vida
IEnumerable<IMessage> GetAllOutgoingMessages(this ILifeline lifeline);
// both from lifeline and execution occurrences
IEnumerable<IMessage> GetAllIncomingMessages(this ILifeline lifeline);
ILifeline GetSourceLifeline(this IMessage message);
// may return null for found messages
ILifeline GetTargetLifeline(this IMessage message);
// may return null for lost messages
Importación de paquetes
IEnumerable<IPackage>GetImportedPackages(this INamespace namespace);
IEnumerable<INamespace> GetImportingNamespaces(this IPackage package);
Ampliación e inclusión de casos de uso
IEnumerable<IUseCase>GetExtendedCases(this IUseCase usecase);
IEnumerable<IUseCase>GetExtendingCases(this IUseCase usecase);
IEnumerable<IUseCase>GetIncludedCases(this IUseCase usecase);
IEnumerable<IUseCase>GetIncludingCases(this IUseCase usecase);
Enumerar relaciones
Todas las propiedades del modelo UML que devuelven varios valores son compatibles con la interfaz IEnumerable<>.Esto significa que puede utilizar Expresiones de consultas LINQ y los métodos de extensión definidos en el espacio de nombres System.Linq.
Por ejemplo:
from shape in Context.CurrentDiagram.GetSelectedShapes<IClassifier>()
where shape.Color == System.Drawing.Color.Red
select shape.Element