Sdílet prostřednictvím


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.

Ee349042.collapse_all(cs-cz,VS.110).gifDovoz 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í.

Ee349042.collapse_all(cs-cz,VS.110).gifZí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;
             ...

Ee349042.collapse_all(cs-cz,VS.110).gifGenerová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

Ee349042.collapse_all(cs-cz,VS.110).gifVytvoř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"  );

Ee349042.collapse_all(cs-cz,VS.110).gifVytvoř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.

Ee349042.collapse_all(cs-cz,VS.110).gifPouží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í

Postup: definovat omezení ověření pro modely UML

Programování v rozhraní API UML