Postup: definovat omezení ověření pro modely UML
V Visual Studio Ultimate, můžete definovat omezení ověření, zda model splňuje podmínku zadáte.Můžete například definovat omezení, zda uživatel nevytváří smyčky vztahy dědičnosti.Omezení je vyvolána, pokud se uživatel pokusí otevřít nebo uložit model a lze vyvolat také ručně.Jestliže omezení, chybová zpráva, že definujete vkládá okna chyby.Můžete balíček těchto omezení do Visual Studio rozšíření integrace (VSIX) a distribuovat do jiných Visual Studio Ultimate uživatelů.
Můžete také definovat omezení, které ověřují modelu proti externích zdrojů, například databází.
[!POZNÁMKA]
Pokud chcete ověřit kód programu proti diagramu vrstvy, viz Přidání vlastní ověření architektura diagramy vrstvy.
Požadavky
Visual Studio SDK, která lze získat od Visual Studio Galerie.
Visual Studio vizualizaci a modelování SDK, která lze získat od Visual Studio vizualizaci a modelování SDK na kód Galerie.
Ověření omezení použití
Ověření omezení jsou použity ve třech případech: při uložení modelu; Při otevření modelu; a po klepnutí na tlačítko Ověření modelu UML na Architektura nabídce.V každém případě pouze omezení, které byly definovány pro případ, že se uplatní, přestože obvykle by každé omezení ve více než jednom případě definovat.
Jsou hlášeny chyby ověření platnosti v Visual Studio chyb a poklepáním na chyby vyberte prvky modelu, které jsou chybné.
Další informace o použití ověření viz Ověření modelu UML.
Definování ověření rozšíření
Ověření rozšíření UML designer vytvoříte vytvořit třídu, která definuje omezení ověření a vložit třídy v aplikace Visual Studio integrace rozšíření (VSIX).VSIX chová jako kontejner, omezení lze nainstalovat.Existují dvě alternativní metody ověření rozšíření definice:
Vytvořte vlastní VSIX pomocí šablony projektu ověření rozšíření. To je rychlejší metodu.Pokud chcete kombinovat s jinými typy rozšíření jako příkazy nabídky, vlastní panel nástrojů položky vaše omezení ověření nebo speciálního tahu pro obslužné rutiny použijte.Můžete definovat několik omezení do jedné třídy.
Vytvořte samostatné ověření třídy a VSIX projekty. Tuto metodu použijte, pokud chcete sloučit několik typů rozšíření do stejné VSIX.Například pokud váš příkaz očekává modelu dodržovat zvláštní omezení, může vložení do stejného VSIX jako metoda ověřování.
Vytvoření rozšíření ověření v jeho vlastní VSIX
V Nový projekt dialogovém okně vyberte v seznamu Projektů pro modelování, vyberte Ověření rozšíření.
Otevřít .cs soubor v novém projektu a upravovat třídy pro implementaci vašeho omezení ověření.
Další informace naleznete v tématu provádění omezení ověření.
Důležité Ujistěte se, že vaše .cs soubory obsahují následující using prohlášení:
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
Definováním nových metod můžete přidat další omezení.Určit metodu jako metodu ověřování, musí tagované s atributy stejným způsobem jako metoda počáteční ověření.
Vaše omezení test stisknutím klávesy F5.Další informace naleznete v tématu Provádění ověření.
Příkaz nabídky jiného počítače nainstalovat zkopírováním souboru bin\*\*.vsix je sestavena projektu.Další informace naleznete v tématu omezení ověření instalace.
Po přidání dalších .cs soubory, bude obvykle vyžadují následující using příkazy:
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
using Microsoft.VisualStudio.Modeling.Validation;
using Microsoft.VisualStudio.Uml.Classes;
Zde je alternativní postup:
K vytvoření samostatné ověření omezení v projektu knihovny třídy
Vytvoření projektu knihovny třídy, přidání do existujícího řešení VSIX nebo vytváření nových řešení.
Na soubor nabídce zvolte Nový, projektu.
Podle Nainstalované šablony, rozbalte položku Visual C# nebo jazyka Visual Basica potom v prostředním sloupci zvolte Knihovna tříd.
Pokud vaše řešení již obsahuje jeden, vytvoření VSIX projektu:
V Aplikaci Solution Explorer, zvolte v místní nabídce roztoku Přidat, Nový projekt.
Podle Nainstalované šablony, rozbalte položku Visual C# nebo jazyka Visual Basic, pak zvolte rozšíření.V prostředním sloupci, klepněte na tlačítko VSIX projektu.
Nastavte VSIX projektu jako projektu při spuštění roztoku.
- V aplikaci Solution Explorer v místní nabídce projektu VSIX zvolte nastavit jako spuštění projektu.
V source.extension.vsixmanifestpod obsahu, přidat jako součást MEF projektu knihovny tříd:
Na metadat karta, nastavit název VSIX.
Na Cíle nainstalovat karta, Premium a Visual Studio Ultimate nastavit jako cíle.
Na majetku vyberte Novýa v dialogovém okně nastavit:
Typ = MEF komponenty
Zdroj = projektu v aktuální řešení
Projekt = projektu knihovny třídy
Definovat třídy ověření
Tento postup není nutné, pokud jste vytvořili ověření třídy s vlastním VSIX z projektu šablony ověření.
Ověření třídy projektu, přidejte následující odkazy .NET sestavení:
Microsoft.VisualStudio.Modeling.Sdk.11.0
Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml
Microsoft.VisualStudio.Uml.Interfaces
System.ComponentModel.Composition
Přidání souboru do projektu knihovny třídy obsahující kód podobný následujícímu.
Každé omezení ověření je součástí metody, která je označena určitý atribut.Tato metoda používá parametr typu prvku modelu.Při ověření, ověření rámec použije každé metody ověření každého prvku modelu, který odpovídá jeho typ parametru.
Tyto metody můžete umístit do libovolné třídy a obory názvů.Je změňte předvolbu.
using System.Collections.Generic; using System.ComponentModel.Composition; using System.Linq; using Microsoft.VisualStudio.Modeling.Validation; using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml; using Microsoft.VisualStudio.Uml.Classes; // You might also need the other Microsoft.VisualStudio.Uml namespaces. namespace Validation { public class MyValidationExtensions { // SAMPLE VALIDATION METHOD. // All validation methods have the following attributes. [Export(typeof(System.Action<ValidationContext, object>))] [ValidationMethod( ValidationCategories.Save | ValidationCategories.Open | ValidationCategories.Menu)] public void ValidateClassNames (ValidationContext context, // This type determines what elements // will be validated by this method: IClass elementToValidate) { // A validation method should not change the model. List<string> attributeNames = new List<string>(); foreach (IProperty attribute in elementToValidate.OwnedAttributes) { string name = attribute.Name; if (!string.IsNullOrEmpty(name) && attributeNames.Contains(name)) { context.LogError( string.Format("Duplicate attribute name '{0}' in class {1}", name, elementToValidate.Name), "001", elementToValidate); } attributeNames.Add(name); } } // Add more validation methods for different element types. } }
Provádění omezení ověření
Pro testovací účely spusťte v režimu ladění ověřovací metody.
Test ověření omezení
Stiskněte klávesu F5, nebo ladění nabídce zvolte Spustit ladění.
Experimentální výskyt Visual Studio spustí.
Poradce při potížích s: Pokud nový Visual Studio nelze spustit:
Pokud máte více než jeden projekt, nastavte VSIX projektu je projekt spuštění roztoku.
V aplikaci Solution Explorer v místní nabídce po spuštění nebo pouze projekt zvolte Vlastnosti.V editoru vlastností projektu, vyberte ladění kartu.Zkontrolujte, zda řetězec v spustit externí program pole je úplná cesta Visual Studio, obvykle:
C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe
Experimentální v Visual Studio, otevření nebo vytvoření projektu modelování a otevření nebo vytvoření diagramu modelu.
Nastavit testovací vzorek omezení uvedené v předchozí části:
Otevřete diagram třídy.
Vytvoření třídy a přidat dva atributy, které mají stejný název.
V místní nabídce kdekoli v diagramu vyberte ověřit.
Všechny chyby v modelu budou zaznamenány v okně chyby.
Poklepejte na zprávu o chybě.Pokud prvky uvedené v sestavě jsou zobrazeny na obrazovce, bude zvýrazněn.
Poradce při potížích s: Pokud ověřit příkaz nezobrazí v nabídce, ujistěte se, že:
Ověření projektu je uveden jako součást MEF v majetku karta v source.extensions.manifest VSIX projektu.
Správné Export a ValidationMethod atributy jsou připojeny k ověření metody.
ValidationCategories.Menuje zahrnuta v argumentu pro ValidationMethod se skládá atributu a hodnoty ostatních pomocí logických nebo (|).
Všechny parametry Import a Export jsou platné atributy.
Omezení hodnocení
Metoda ověření by měla určit, zda je omezení ověření, které chcete použít hodnotu true nebo false.Pokud je hodnota true, měla Neprovádět žádnou akci.Pokud NEPRAVDA, je by hlášení chyby pomocí metody poskytované ValidationContext parametr.
[!POZNÁMKA]
Metody ověření neměli měnit model.Nebo v pořadí že bude provedeno omezení není zaručeno při.Pokud máte předávání informací mezi následné spuštění metody ověřování v rámci ověřování spustit, můžete použít místní mezipaměti podle Koordinaci více ověření.
Například pokud chcete zajistit, že každý typ (třídy, rozhraní nebo čítače výčtu) má název, který je nejméně tří znaků, můžete použít tuto metodu:
public void ValidateTypeName(ValidationContext context, IType type)
{
if (!string.IsNullOrEmpty(type.Name) && type.Name.Length < 3)
{
context.LogError(
string.Format("Type name {0} is too short", type.Name),
"001", type);
}
}
Viz Programování v rozhraní API UML informace o metodách a typy můžete použít k procházení a čtení modelu.
O metodách ověřování omezení
Každé omezení ověření je definována metoda následující formulář:
[Export(typeof(System.Action<ValidationContext, object>))]
[ValidationMethod(ValidationCategories.Save
| ValidationCategories.Menu
| ValidationCategories.Open)]
public void ValidateSomething
(ValidationContext context, IClassifier elementToValidate)
{...}
Atributy a parametry každé metody ověření jsou:
[Export(typeof(System.Action <ValidationContext, object>))] |
Definuje metodu jako omezení ověření pomocí spravované rozšiřitelnosti Framework (MEF). |
[ValidationMethod (ValidationCategories.Menu)] |
Určuje, kdy bude provedena ověření.Bitový operátor OR použití (|), pokud chcete kombinovat více než jednu možnost. Menu= vyvolán nabídky ověřit. Save= uplatnit na uložení modelu. Open= uplatnit na otevření modelu.Load= uplatnit na uložení modelu, ale pro rozporu s uživatele upozorní, že nebude možné znovu otevřít model.Zkratka pro načítání před modelu je analyzován. |
public void ValidateSomething (ValidationContext context, IElement element) |
Nahradit druhý parametr IElement podle typu prvku, na který chcete omezení použít.Bude vyvolána metoda omezení na všechny prvky zadaného typu. Název metody, není důležité. |
Můžete definovat chcete s různými typy druhý parametr tolik ověřovací metody.Při ověření, bude volat každou metodu ověření každého prvku modelu, který odpovídá typu parametru.
Hlášení chyby ověření
Vytvořit zprávu o chybě, pomocí metod podle ValidationContext:
context.LogError("error string", errorCode, elementsWithError);
"error string"Zobrazí se v Visual Studio seznam chyb
errorCodeje řetězec, který by měl být jedinečný identifikátor chyby
elementsWithErroridentifikuje prvky modelu.Když uživatel poklepe zprávu o chybě, bude vybrán obrazec představující tento prvek.
LogError(),LogWarning()a LogMessage() umístit v různých částech seznam chybových zpráv.
Použití metod ověřování
Ověření je použito u všech prvků modelu, včetně částí větší prvky třídy atributy a parametry operace a vztahy.
Každá metoda ověření u každého prvku, který odpovídá typu v jeho druhý parametr.To znamená, že, například definujete ověřovací metody s druhý parametr IUseCase a s jeho nadtyp IElement, a obě tyto metody budou použity pro každý případ použití v modelu.
Hierarchie typů je uveden v Typy prvků modelu.
Prvky lze rovněž použít následující vztahy.Například pokud byly definovat metodu ověření v IClass, může smyčku jeho vlastnictví vlastnosti:
public void ValidateTypeName(ValidationContext context, IClass c)
{
foreach (IProperty property in c.OwnedAttributes)
{
if (property.Name.Length < 3)
{
context.LogError(
string.Format(
"Property name {0} is too short",
property.Name),
"001", property);
}
}
}
Ověřovací metoda vytváření modelu
Pokud chcete zajistit, aby metoda ověřování volala přesně jednou během každého ověřování spustit, můžete ověřit IModel:
using Microsoft.VisualStudio.Uml.AuxiliaryConstructs; ...
[Export(typeof(System.Action<ValidationContext, object>))]
[ValidationMethod(ValidationCategories.Menu)]
public void ValidateModel(ValidationContext context, IModel model)
{ foreach (IElement element in model.OwnedElements)
{ ...
Ověření obrazce a diagramy
Ověřovací metody nejsou uplatňována na prvky zobrazení diagramů a tvary, protože je primárním účelem ověření metod ověření modelu.Ale získat přístup k aktuálním diagramu, diagramu kontextu.
Ve své třídě ověření deklarovat DiagramContext jako importované vlastnosti:
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
...
[Import]
public IDiagramContext DiagramContext { get; set; }
Můžete metodu ověření, DiagramContext přístup k aktuálním diagramu fokus, pokud existuje:
[Export(typeof(System.Action<ValidationContext, object>))]
[ValidationMethod(ValidationCategories.Menu)]
public void ValidateModel(ValidationContext context, IModel model)
{
IDiagram focusDiagram = DiagramContext.CurrentDiagram;
if (focusDiagram != null)
{
foreach (IShape<IUseCase> useCaseShape in
focusDiagram.GetChildShapes<IUseCase>())
{ ...
Protokolovat chyby, musíte získat prvek modelu, který obrazec představuje, protože nelze předat tvar na LogError:
IUseCase useCase = useCaseShape.Element;
context.LogError(... , usecase);
Koordinaci více ověření
Při ověření, například uživatel v nabídce diagramu každou metodu ověření u každého prvku modelu.To znamená, že v jediné vyvolání framework ověření stejným způsobem lze mnohokrát na různých prvků.
To představuje problém pro ověření, která se týkají vztahů mezi prvky.Mohou například zapisovat ověření, který začíná, vyslovte případu použití a traverses include vztahů k ověření, že neexistují žádné smyčky.Ale když metody u každého případu použití v modelu, který má mnoho include odkazy, je pravděpodobné, že opakovaně stejné oblasti modelu zpracování.
Této situaci se vyhnete je kontextu mezipaměti, ve kterém se zachovají informace během procesu ověřování.Můžete jej předávání informací mezi různými spouštění metod ověření.Je například uložit seznam prvků, které již byly řešeny v ověřování spustit.Mezipaměť je vytvořen na začátku každé ověření spuštění a předávání informací mezi různými ověření nelze použít.
context.SetCacheValue<T> (name, value) |
Uložit hodnotu |
context.TryGetCacheValue<T> (name, out value) |
Získáte hodnotu.Vrátí hodnotu true v případě úspěchu. |
context.GetValue<T>(name) |
Získáte hodnotu. |
Context.GetValue<T>() |
Získáte hodnotu zadaného typu. |
Instalace a odinstalace rozšíření
Můžete nainstalovat Visual Studio rozšíření ve vašem počítači i v jiných počítačích.
Instalace rozšíření
V počítači, vyhledejte .vsix soubor, který byl vytvořen společností VSIX projektu.
V Aplikaci Solution Explorer, zvolte v místní nabídce projektu VSIX Otevřené složky v programu Průzkumník Windows.
Vyhledejte soubor bin\*\YourProject.vsix
Kopie .vsix soubor v cílovém počítači, do kterého chcete nainstalovat rozšíření.To může být v počítači nebo jiný.
- Cílový počítač musí mít jednu z edice Visual Studio zadaný v source.extension.vsixmanifest.
V cílovém počítači otevřete .vsix souboru.
Visual Studio rozšíření instalační otevře a nainstaluje rozšíření.
Spuštění nebo restartování Visual Studio.
Odinstalujte rozšíření
Na Nástroje nabídce zvolte Extension Manager.
Rozbalte instalaci rozšíření.
Vyberte rozšíření a pak zvolte Odinstalace.
Zřídka chybná rozšíření načtena a vytvoří sestavu v okně chybové, ale nezobrazí Extension Manager.V takovém případě můžete odebrat příponu odstraněním souboru z následujícího umístění kde % LocalAppData % je obvykle název_jednotky: \Users\uživatelské jméno\AppData\Local:
% LocalAppData %\Microsoft\VisualStudio\11.0\Extensions
Příklad
V tomto příkladu vyhledá ve vztahu závislosti mezi prvky smyčky.
Ji ověří obě na Uložit a na příkaz ověřit.
/// <summary>
/// Verify that there are no loops in the dependency relationsips.
/// In our project, no element should be a dependent of itself.
/// </summary>
/// <param name="context">Validation context for logs.</param>
/// <param name="element">Element to start validation from.</param>
[Export(typeof(System.Action<ValidationContext, object>))]
[ValidationMethod(ValidationCategories.Menu
| ValidationCategories.Save | ValidationCategories.Open)]
public void NoDependencyLoops(ValidationContext context, INamedElement element)
{
// The validation framework will call this method
// for every element in the model. But when we follow
// the dependencies from one element, we will validate others.
// So we keep a list of the elements that we don't need to validate again.
// The list is kept in the context cache so that it is passed
// from one execution of this method to another.
List<INamedElement> alreadySeen = null;
if (!context.TryGetCacheValue("No dependency loops", out alreadySeen))
{
alreadySeen = new List<INamedElement>();
context.SetCacheValue("No dependency loops", alreadySeen);
}
NoDependencyLoops(context, element,
new INamedElement[0], alreadySeen);
}
/// <summary>
/// Log an error if there is any loop in the dependency relationship.
/// </summary>
/// <param name="context">Validation context for logs.</param>
/// <param name="element">The element to be validated.</param>
/// <param name="dependants">Elements we've followed in this recursion.</param>
/// <param name="alreadySeen">Elements that have already been validated.</param>
/// <returns>true if no error was detected</returns>
private bool NoDependencyLoops(ValidationContext context,
INamedElement element, INamedElement[] dependants,
List<INamedElement> alreadySeen)
{
if (dependants.Contains(element))
{
context.LogError(string.Format("{0} should not depend on itself", element.Name),
"Fabrikam.UML.NoGenLoops", // unique code for this error
dependants.SkipWhile(e => e != element).ToArray());
// highlight elements that are in the loop
return false;
}
INamedElement[] dependantsPlusElement =
new INamedElement[dependants.Length + 1];
dependants.CopyTo(dependantsPlusElement, 0);
dependantsPlusElement[dependantsPlusElement.Length - 1] = element;
if (alreadySeen.Contains(element))
{
// We have already validated this when we started
// from another element during this validation run.
return true;
}
alreadySeen.Add(element);
foreach (INamedElement supplier in element.GetDependencySuppliers())
{
if (!NoDependencyLoops(context, supplier,
dependantsPlusElement, alreadySeen))
return false;
}
return true;
}