Postup: úprava sekvenční diagramy pomocí rozhraní API UML
Interakce je posloupnost zpráv mezi sadu životnosti.Interakce se zobrazí v sekvenčním diagramu.
Úplné podrobnosti o rozhraní API naleznete v Microsoft.VisualStudio.Uml.Interactions.
Další obecné informace týkající se psaní příkazů a obslužné rutiny speciálního tahu pro diagramy UML, viz Postup: definování příkazu nabídky diagramu modelování.
Základní kód.
Dovoz oboru názvů
Musí obsahovat následující using příkazy:
using Microsoft.VisualStudio.Uml.Classes;
// for basic UML types such as IPackage
using Microsoft.VisualStudio.Uml.Interactions;
// for interaction types
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
// to create elements and use additional functions
Pokud vytváříte příkazy nabídky a speciálního tahu pro obslužné rutiny, budete také potřebovat:
using System.ComponentModel.Composition;
// for Import and Export
using Microsoft.VisualStudio.Modeling.ExtensionEnablement;
// for ICommandExtension
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
// for diagrams and context
Další informace naleznete v tématu Postup: definování příkazu nabídky diagramu modelování.
Získávání kontextu
Pokud upravujete interakci jako součást příkazu nebo gesto pro obsluhu v sekvenčním diagramu, můžete získat odkaz na kontextu.Příklad:
[SequenceDesignerExtension]
[Export(typeof(ICommandExtension))]
public class MySequenceDiagramCommand : ICommandExtension
{
[Import]
public IDiagramContext Context { get; set; }
public void QueryStatus (IMenuCommand command)
{
ISequenceDiagram sequenceDiagram =
Context.CurrentDiagram as ISequenceDiagram;
...
Generování a sekvence UML, diagramy
Existují dva druhy sekvenční diagramy: ty, které jsou ručně vytvořené v projektu modelování UML a ty, které jsou generovány z programového kódu.Můžete použít UmlMode zjistit, jaký druh sekvenčním diagramu pracujete s vlastností.
Například pokud chcete provést příkaz nabídky, která je pouze viditelné na sekvenční diagramy UML pak bude QueryStatus() metody mohou zahrnovat následující příkaz:
command.Enabled = command.Visible =
sequenceDiagram != null && sequenceDiagram.UmlMode;
Vygenerované posloupnosti diagramu, životnosti, zpráv a dalších prvků je podobný jako v sekvenčním diagramu UML.V modelu UML má Model Store root Model, který vlastní všechny ostatní prvky; ale generované interakce existuje v úložišti modelu vlastní má hodnotu null kořenové:
IModel rootModel = sequenceDiagram.ModelStore.Root;
// !sequenceDiagram.UmlMode == (rootModel == null)
Vytvoření a zobrazení interakce
Vytvořte interakci jako podřízený balíčku nebo model.
Například pokud vyvíjíte příkazu, který může být provedena na prázdné sekvenčním diagramu, by měly vždy začnete tak, že zkontrolujete, zda existuje interakce.
public void Execute (IMenuCommand command)
{
ISequenceDiagram sequenceDiagram =
Context.CurrentDiagram as ISequenceDiagram;
if (sequenceDiagram == null) return;
// Get the diagram's interaction:
IInteraction interaction = sequenceDiagram.Interaction;
// A new sequence diagram might have no interaction:
if (interaction == null)
{
// Get the home package or model of the diagram:
IPackage parentPackage = sequenceDiagram.GetObject<IPackage>();
interaction = parentPackage.CreateInteraction();
// Display the interaction on the sequence diagram:
sequenceDiagram.Bind(interaction);
}
Aktualizace interakci a jeho rozložení.
Při aktualizaci interakci vždy konec operace aktualizace rozvržení pomocí jedné z následujících metod:
ISequenceDiagram.UpdateShapePositions() upraví pozice obrazce, které nedávno byla vložena nebo přesunuta a jejich sousedních obrazců.
ISequenceDiagram.Layout([SequenceDiagramLayoutKinds])Překreslí celý diagram.Parametr můžete určit umístění životnosti nebo zprávy.
To je zvláště důležité při vkládání nové prvky nebo přesunout existující prvky.Nebudou správné pozice v diagramu až do provedení jedné z těchto operací.Potřebujete pouze jeden z těchto operací jednou na konci série změn volání.
Aby bemusing uživatele, který provádí vrácení zpět po příkazu, použijte ILinkedUndoTransaction uzavřete změny a poslední Layout() nebo UpdateShapePositions() operací.Příklad:
using (ILinkedUndoTransaction transaction = LinkedUndoContext.BeginTransaction("create loop"))
{
Interaction.CreateCombinedFragment(InteractionOperatorKind.Loop, messages);
Diagram.UpdateShapePositions();
transaction.Commit();
}
Použití ILinkedUndoTransaction, je nutné provést toto prohlášení ve své třídě:
[Import] ILinkedUndoContext LinkedUndoContext { get; set; }
Další informace naleznete v tématu Jak: aktualizace modelu odkaz pomocí transakcí.
Vytváření interakce
Vytvoření životnosti
ILifeline lifeline = interaction.CreateLifeline();
Životnost představuje prvek připojitelné, instanci typu.Například pokud interakce se používá k zobrazení, jak součást deleguje příchozí zprávy jeho vnitřní části, životnosti zničených může představovat porty a součást:
foreach (IConnectableElement part in
component.Parts
.Concat<IConnectableElement>(component.OwnedPorts))
{
ILifeline lifeline = interaction.CreateLifeline();
lifeline.Represents = part;
}
Pokud interakce ukazuje libovolnou sadu objektů, můžete také vytvořit vlastnost nebo jiné IConnectableElement v samotném interakci:
ILifeline lifeline = interaction.CreateLifeline();
IProperty property1 = interaction.CreateProperty();
property1.Type = model.CreateInterface();
property1.Type.Name = "Type 1";
lifeline.Represents = property1;
Další alternativou je bez odkazu na prvek připojitelné nastavit název a typ životnosti:
ILifeline lifeline = interaction.CreateLifeline();
lifeline.Name = "c1";
lifeline.SetInstanceType("Customer");
System.Diagnostics.Debug.Assert(
lifeline.GetDisplayName() == "c1:Customer" );
Vytvoření zprávy
Chcete-li vytvořit zprávu, je nutné určit body kurzoru na životnosti zdrojové a cílové.Příklad:
interaction.CreateMessage( sourceInsertionPoint,
targetInsertionPoint,
MessageKind.Complete,
MessageSort.ASynchCall)
Vytvořit zprávu, která má Nedefinovaný zdroj nebo cíl nedefinovaný:
interaction.CreateLostFoundMessage(MessageKind.Found, insertionPoint);
Existuje několik zpráv, které lze použít k identifikaci vkládání bodů ve všech klíčových bodů na životnost:
Metoda na ILifeline |
Použít v tomto okamžiku vložení |
---|---|
FindInsertionPointAtTop() |
Horní životnosti. |
FindInsertionPointAtBottom() |
Konec životnosti. |
FindInsertionPointAfterMessage (IMessage previous) |
Bod ihned po zadanou zprávu. |
FindInsertionPointAfterExecutionSpecification (IExecutionSpecification previous) |
Bod může být na životnosti nebo na blok nadřazené spuštění specifikace. |
FindInsertionPointAfterInteractionUse (IInteractionUse previous) |
Bod po použití interakci. |
FindInsertionPointAfterCombinedFragment (ICombinedFragment previous) |
Bod následující Fragment kombinované. |
FindInsertionPoint(IExecutionSpecification block) |
Horní blok spuštění. |
FindInsertionPoint(IInteractionOperand fragment) |
Horní operand kombinované fragmentu. |
Při vytváření zprávy pečlivě vyhnout definování zprávu, která by křížení jinou zprávu.
Používá k vytvoření kombinované fragmenty a interakce
Kombinované fragmenty a používá interakce můžete vytvořit zadáním textový kurzor na každý životnost, který musí být předmětem prvek.Dbá, aby určení nastavení bodů, které by křížení existující zprávu nebo fragment.
Interaction.CreateCombinedFragment(InteractionOperatorKind.Loop,
Interaction.Lifelines.Select(lifeline => lifeline.FindInsertionPointAtTop()));
Interaction.CreateInteractionUse(
Interaction.Lifelines.Select(lifeline => lifeline.FindInsertionPointAtTop()));
Můžete také vytvořit kombinované fragmentu, který pokrývá existující soubor zpráv.Zprávy musí všechny být získání na obrazci životnosti stejného nebo blokovat spuštění.
ICombinedFragment cf = Interaction.CreateCombinedFragment(
InteractionOperatorKind.Loop,
Interaction.Lifelines.First().GetAllOutgoingMessages());
Kombinované fragment je vždy vytvořena s jedním operandem.Chcete-li vytvořit nový operand, je nutné zadat existující operandem, který chcete vložit před nebo po a zda chcete vložit za nebo před ní:
// Create an additional operand before the first
cf.CreateInteractionOperand(cf.Operands.First(), false);
// Create an additional operand after the last:
cf.CreateInteractionOperand(cf.Operands.Last(), true);
Poradce při potížích
Obrazce se zobrazí v nesprávné pozici, pokud změny není vyplněna UpdateShapePositions() nebo Layout() operace.
Většina problémů způsobených vkládání bodů nesprávně zarovnány, takže nové zprávy nebo fragmenty musel mezi ostatními.Příznaky mohou být provedena žádná změna, nebo je výjimka.Výjimka může vyvolána není až UpdateShapePositions() nebo Layout() operace.
Viz také
Referenční dokumentace
Microsoft.VisualStudio.Uml.Interactions
Koncepty
Rozšíření modelů UML a diagramů
Postup: definování příkazu nabídky diagramu modelování
Postup: definovat vlastní položku sady nástrojů pro modelování