Jak: definiowanie ograniczeń sprawdzania poprawności dla modeli UML
W Visual Studio Ultimate, ograniczenia sprawdzania poprawności, sprawdzić, czy model spełnia warunek, można określić, które można zdefiniować.Na przykład można zdefiniować ograniczenie, aby upewnić się, że użytkownik nie tworzy pętlę relacje dziedziczenia.Ograniczenie jest wywoływana, gdy użytkownik próbuje otworzyć lub zapisać model i można również uruchomić ręcznie.Jeśli ograniczenie nie powiedzie się, dodaje się komunikat o błędzie, można zdefiniować w oknie błędów.Można spakować te ograniczenia do Visual Studio integracji rozszerzenie (VSIX) i rozprowadzić innych Visual Studio Ultimate użytkowników.
Można także zdefiniować ograniczenia, które poprawności modelu przeciwko zasobów zewnętrznych, takich jak bazy danych.
[!UWAGA]
Jeśli chcesz sprawdzić poprawność kodu programu przeciwko diagram warstwy, zobacz Dodawanie sprawdzania poprawności architektury niestandardowe diagramy warstwy.
Wymagania
Visual Studio SDK, który można otrzymać od Programu Visual Studio galerii.
Visual Studio, wizualizacji i modelowania SDK, który można otrzymać od Visual Studio wizualizacji i modelowania zestawu SDK w galerii kodu.
Stosowania ograniczeń sprawdzania poprawności
Ograniczeń sprawdzania poprawności są stosowane w trzech przypadkach: podczas zapisywania modelu; Po otwarciu modelu; i kliknięcie Poprawności modelu UML na architektury menu.W każdym przypadku tylko ograniczenia, które zostały zdefiniowane w przypadku zastosowanych, chociaż zazwyczaj należy zdefiniować każde ograniczenie do zastosowania w przypadku więcej niż jeden.
Błędy sprawdzania poprawności są zgłaszane w Visual Studio błędów, a następnie kliknąć dwukrotnie błąd, aby wybrać elementy modelu, które są w błąd.
Aby uzyskać więcej informacji dotyczących stosowania sprawdzania poprawności, zobacz Walidacja modelu UML.
Definiowanie rozszerzenia sprawdzania poprawności
Aby utworzyć rozszerzenie sprawdzania poprawności dla projektanta UML, muszą utworzyć klasa, która definiuje ograniczeń sprawdzania poprawności i osadzić klasy w Visual Studio Integration Extension (VSIX).VSIX działa jako kontener, który można zainstalować ograniczenie.Istnieją dwie alternatywne metody definiowania rozszerzeń sprawdzania poprawności:
Tworzyć rozszerzenia sprawdzania poprawności w własnej VSIX przy użyciu szablonu projektu. Jest to metoda szybsza.Użyj, jeśli nie chcesz łączyć z innymi typami rozszerzenie poleceń menu, przybornik niestandardowych elementów, na przykład swoje ograniczenia sprawdzania poprawności lub gestu obsługi.Można zdefiniować kilka ograniczeń w jednej klasie.
Tworzenie klasy oddzielnych sprawdzania poprawności i projektów VSIX. Metoda ta jest używana, jeśli chcesz połączyć kilka typów rozszerzenia w tym samym VSIX.Na przykład jeśli polecenia menu oczekuje modelu do przestrzegania szczególnych ograniczeń, może go osadzić w tej samej VSIX jako metoda sprawdzania poprawności.
Aby utworzyć rozszerzenie sprawdzania poprawności w VSIX własnych
W Nowy projekt dialogowe, pod Modelowanie projektów, zaznacz Rozszerzenia sprawdzania poprawności.
Otwórz .cs plik w nowym projekcie i modyfikować klasy do wdrożenia na ograniczenie sprawdzania poprawności.
Aby uzyskać więcej informacji, zobacz wykonawczych ograniczenie sprawdzania poprawności.
Ważne Upewnij się, że Twój .cs pliki zawierają następujące using instrukcji:
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml;
Definiowanie nowych metod można dodawać dodatkowe ograniczenia.Aby zidentyfikować metody jako metoda sprawdzania poprawności, go muszą być oznakowane z atrybutami w taki sam sposób jak metoda sprawdzania poprawności początkowego.
Przetestuj swoje ograniczenia naciskając klawisz F5.Aby uzyskać więcej informacji, zobacz Wykonywania sprawdzania poprawności.
Zainstaluj polecenia menu na innym komputerze, kopiując plik bin\*\*.vsix wbudowane w projekcie.Aby uzyskać więcej informacji, zobacz Instalowanie ograniczeń sprawdzania poprawności.
Po dodaniu innych .cs pliki, będzie zwykle wymagają następujące using instrukcji:
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;
Oto procedura alternatywne:
Aby utworzyć ograniczenie oddzielnych sprawdzania poprawności w projekcie biblioteki klas
Tworzenie projektu biblioteki klas, dodanie go do istniejącego rozwiązania VSIX albo tworzenie nowego rozwiązania.
Na pliku menu wybierz Nowy, projektu.
W obszarze Zainstalowane szablonów, rozwiń Visual C# lub języka Visual Basic, a następnie w środkowej kolumnie Wybierz Biblioteka klas.
Chyba że rozwiązanie zawiera już jeden, utworzenie projektu VSIX:
W Solution Explorer, w menu skrótów roztworu wybierz Dodaj, Nowy projekt.
W obszarze Zainstalowane szablonów, rozwiń Visual C# lub języka Visual Basic, następnie wybierz rozszerzalności.W środkowej kolumnie, kliknij Projektu VSIX.
Ustaw projektu VSIX jako projekt uruchamiania roztworu.
- W oknie Solution Explorer projektu VSIX, w menu skrótów wybierz polecenie jako uruchomienia projektu.
W source.extension.vsixmanifest, zawartości, dodać jako składnik MEF projektu biblioteki klas:
Na metadanych karcie, należy ustawić nazwę VSIX.
Na Cele zainstalować karta, ustaw Visual Studio Ultimate i premii jako cele.
Na aktywów tab, wybrać Nowyi w oknie dialogowym Ustaw:
Typ = MEF składnika
Źródło = w roztworze bieżącego projektu
Projekt = projektu biblioteki klas
Aby zdefiniować klasy sprawdzania poprawności
Nie ma potrzeby tej procedury, jeśli utworzono klasy sprawdzania poprawności z własną VSIX z szablonu projektu sprawdzania poprawności.
W projekcie klasy sprawdzania poprawności Dodaj odwołania do następujących .NET zespołów:
Microsoft.VisualStudio.Modeling.Sdk.11.0
Microsoft.VisualStudio.ArchitectureTools.Extensibility.Uml
Microsoft.VisualStudio.Uml.Interfaces
System.ComponentModel.Composition
Dodawanie pliku do projektu biblioteki klasy zawierające kod, który jest podobny do następującego przykładu.
Każde ograniczenie sprawdzania poprawności jest zawarty w metoda, która jest oznaczony atrybutem szczególnych.Metoda akceptuje parametr typu elementu modelu.Podczas sprawdzania poprawności jest wywoływana, w ramach sprawdzania poprawności będzie dotyczyć każdej metody sprawdzania poprawności każdego elementu modelu, który odpowiada jego typ parametru.
Metody te można umieścić w jakichkolwiek klas i przestrzenie nazw.Zmienić ich preferencjami.
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. } }
Wykonywanie ograniczenie sprawdzania poprawności
Do celów badania należy wykonać swoje metody sprawdzania poprawności w trybie debugowania.
Aby przetestować ograniczenie sprawdzania poprawności
Naciśnij F5, lub na debugowania menu wybierz Uruchomić debugowanie.
Wystąpienie doświadczalnych Visual Studio uruchamia.
Rozwiązywanie problemów z: Jeśli nowy Visual Studio nie uruchamia:
Jeśli masz więcej niż jeden projekt, upewnij się, że projekt VSIX jest ustawiona jako projekt uruchamiania roztworu.
W oknie Solution Explorer uruchamiania lub tylko projektu, w menu skrótów wybierz polecenie Właściwości.Edytor właściwości projektu wybierz debugowania kartę.Upewnij się, że ciąg w Start zewnętrzny program pole jest pełna nazwa ścieżki Visual Studio, zazwyczaj:
C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe
W doświadczalnych Visual Studio, otwórz lub Utwórz projekt modelowania i Otwórz lub Utwórz diagram modelowania.
Aby zdefiniować badania próbki ograniczenia w poprzedniej sekcji
Otwórz diagram klasy.
Tworzenie klasy i dodać dwa atrybuty, które mają taką samą nazwę.
W menu skrótów w dowolne miejsce na diagramie wybierz sprawdzania poprawności.
Wszelkie błędy w modelu będą raportowane w oknie błędów.
Kliknij dwukrotnie raport o błędach.Jeśli elementy wymienione w raporcie są widoczne na ekranie, zostaną one wyróżnione.
Rozwiązywanie problemów z: Jeśli sprawdzania poprawności polecenie nie jest wyświetlane w menu, upewnij się, że:
Sprawdzanie poprawności projektu jest wymieniony jako składnik MEF w aktywów kartę w source.extensions.manifest VSIX projektu.
Prawidłowe Export i ValidationMethod atrybuty są dołączone do metody sprawdzania poprawności.
ValidationCategories.Menuznajduje argument dla ValidationMethod atrybutu, a składa się z innych wartości przy użyciu lub logiczny (|).
Parametry wszystkich Import i Export atrybuty są prawidłowe.
Ocena ograniczenia
Metody sprawdzania poprawności, należy określić, czy ograniczenie sprawdzania poprawności, które chcesz zastosować jest PRAWDA lub FAŁSZ.Jeśli wartość true, to należy nic nie.Jeśli ma wartość FAŁSZ, to powinny Zgłoś błąd przy użyciu metod dostarczonych przez ValidationContext parametru.
[!UWAGA]
Metody sprawdzania poprawności nie należy zmieniać modelu.Ma gwarancji po lub w jakiej kolejności ograniczenia będzie wykonywany.Jeśli masz przekazywania informacji między kolejnymi egzekucji metody sprawdzania poprawności w ramach sprawdzania poprawności i uruchamianie, można użyć pamięci podręcznej kontekstu opisane w Koordynację z wielu funkcji sprawdzania poprawności.
Na przykład zapewnić, że każdy rodzaj (klasy, interfejsu lub moduł wyliczający) ma nazwę, która jest co najmniej trzech znaków, można użyć tej metody:
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);
}
}
Zobacz Programowanie przy użyciu interfejsu API UML informacji o metodach i typów można użyć do nawigacji i odczytać modelu.
O metodach ograniczenie sprawdzania poprawności
Każde ograniczenie sprawdzania poprawności jest określona metoda następującą postać:
[Export(typeof(System.Action<ValidationContext, object>))]
[ValidationMethod(ValidationCategories.Save
| ValidationCategories.Menu
| ValidationCategories.Open)]
public void ValidateSomething
(ValidationContext context, IClassifier elementToValidate)
{...}
Atrybuty i parametry każdej metody sprawdzania poprawności są:
[Export(typeof(System.Action <ValidationContext, object>))] |
Definiuje metodę jako ograniczenie sprawdzania poprawności przy użyciu zarządzanych rozszerzeń Framework (MEF). |
[ValidationMethod (ValidationCategories.Menu)] |
Określa, kiedy wykonywane sprawdzanie poprawności.Użyj logiczną lub (|), jeśli chcesz połączyć więcej niż jedną opcję. Menu= wywoływane przez menu sprawdzania poprawności. Save= powoływać się na zapisanie modelu. Open= na otwieranie modelu.Load= powoływać się na zapisanie modelu, ale za naruszenie ostrzega użytkownika że może nie być możliwe ponowne otwarcie modelu.Skrót na ładowanie przed modelu jest analizowany. |
public void ValidateSomething (ValidationContext context, IElement element) |
Zamień drugi parametr IElement przez typ elementu, do którego ma zastosowanie ograniczenia.Metoda ograniczenie zostanie wywołany na wszystkie elementy określonego typu. Nazwa metody jest nieistotna. |
Można zdefiniować jako wiele metod sprawdzania poprawności, ma, z różnymi rodzajami w drugim parametrze.Podczas sprawdzania poprawności jest wywoływana, każda metoda sprawdzania poprawności będzie wezwała do każdego elementu modelu, który jest zgodny z typem parametru.
Raportowanie błędów sprawdzania poprawności
Aby utworzyć raport o błędach, należy używać metod dostarczonych przez ValidationContext:
context.LogError("error string", errorCode, elementsWithError);
"error string"pojawia się w Visual Studio lista błędów
errorCodejest ciągiem, który powinien być identyfikator unikatowy błędu
elementsWithErroridentyfikuje elementy w modelu.Gdy użytkownik kliknie dwukrotnie raport o błędach, kształt przedstawiający element ten będzie zaznaczone.
LogError(),LogWarning()i LogMessage() umieszczać wiadomości w różnych sekcjach lista błędów.
Jak są stosowane metody sprawdzania poprawności
Sprawdzanie poprawności jest stosowany do każdego elementu w modelu tym relacje i części większe elementy, atrybuty klasy jak parametry operacji.
Każda metoda sprawdzania poprawności jest stosowany do każdego elementu, który jest zgodny z typem w jej drugi parametr.Oznacza to, że, na przykład, jeśli zdefiniować metodę sprawdzania poprawności z drugim parametrem IUseCase i innym z jego nadtypów IElement, a następnie obu tych metod będą stosowane do każdego przypadku użycia w modelu.
Hierarchia typów są podsumowywane w Typy elementów modelu.
Elementy można również uzyskać dostęp przez następujące relacje.Na przykład, gdyby zdefiniować metodę sprawdzania poprawności IClass, mógłby pętli jego własnością właściwości:
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);
}
}
}
Tworzenie metody sprawdzania poprawności modelu
Aby zapewnić, że wywoływana jest metoda sprawdzania poprawności, dokładnie po podczas każdego uruchomienia sprawdzania poprawności, można sprawdzić poprawność 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)
{ ...
Sprawdzanie poprawności kształtów i diagramów
Metody sprawdzania poprawności nie są wywoływane na elementy wyświetlane jak kształty, diagramy, ponieważ jest podstawowym celem metod sprawdzania poprawności do sprawdzania poprawności modelu.Jednak dostępu do bieżącego diagramu przy użyciu kontekstu diagramu.
W klasie sprawdzania poprawności, należy zadeklarować DiagramContext jako właściwość przywożone:
using Microsoft.VisualStudio.ArchitectureTools.Extensibility.Presentation;
...
[Import]
public IDiagramContext DiagramContext { get; set; }
Metoda sprawdzania poprawności można DiagramContext dostęp do bieżącego diagramu fokus, jeśli istnieje:
[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>())
{ ...
Aby rejestrować błąd, należy uzyskać elementu modelu, który kształt, ponieważ nie można przekazać kształtu do LogError:
IUseCase useCase = useCaseShape.Element;
context.LogError(... , usecase);
Koordynowanie wielu sprawdzanie poprawności
Podczas sprawdzania poprawności jest wywoływane, na przykład przez użytkownika menu diagram każdej metody sprawdzania poprawności jest stosowane do każdego elementu modelu.Oznacza to, że w pojedynczej grupy w ramach sprawdzania poprawności tej samej metody mogą być stosowane wiele razy do różnych elementów.
To stanowi problem dla sprawdzanie poprawności, które zajmują się relacje między elementami.Na przykład, może napisać sprawdzania poprawności, który rozpoczyna się od powiedzieć, przypadek użycia i traverses include relacje, sprawdź, czy nie pętli.Jednak gdy metoda jest stosowana do każdego przypadku użycia w modelu, który ma wiele include łączy, jest prawdopodobne, że wielokrotnie przetworzyć tych samych obszarach modelu.
Aby uniknąć tej sytuacji, jest bufor kontekstu, w którym informacje jest zachowywane podczas sprawdzania poprawności.Można go użyć do przekazywania informacji między egzekucji różnych metod sprawdzania poprawności.Można na przykład przechowywać listę elementów, które zostały już omówione w tym sprawdzania poprawności, uruchom.Pamięci podręcznej jest tworzony na początku każdego sprawdzania poprawności uruchomienia i nie można używać do przekazywania informacji między działa inny sprawdzania poprawności.
context.SetCacheValue<T> (name, value) |
Wartość magazynu |
context.TryGetCacheValue<T> (name, out value) |
Pobieranie wartości.Zwraca wartość true, jeśli kończy się pomyślnie. |
context.GetValue<T>(name) |
Pobieranie wartości. |
Context.GetValue<T>() |
Pobieranie wartości określonego typu. |
Instalowanie i odinstalowywanie rozszerzenie
Można zainstalować Visual Studio rozszerzenie zarówno na własnym komputerze i na innych komputerach.
Aby zainstalować rozszerzenie
Na komputerze, należy znaleźć .vsix pliku, który został zbudowany przez VSIX projektu.
W Solution Explorer, w menu skrótów projektu VSIX, wybierz polecenie Otwórz Folder w Eksploratorze Windows.
Zlokalizuj plik bin\*\YourProject.vsix
Kopiuj .vsix plik do komputera docelowego, na którym chcesz zainstalować rozszerzenia.Może to być własnego komputera lub innym.
- Na komputerze docelowym musi mieć jedną z wersji z Visual Studio określone w source.extension.vsixmanifest.
Na komputerze docelowym otwórz .vsix pliku.
Instalator rozszerzenie usługi Visual Studio otwiera i instaluje rozszerzenia.
Uruchom lub uruchom ponownie Visual Studio.
Aby odinstalować rozszerzenia
Na Narzędzia menu wybierz Extension Manager.
Rozwiń zainstalowanych rozszerzeń.
Zaznacz rozszerzenie, a następnie wybierz Odinstalowywanie.
Rzadko uszkodzone rozszerzenie nie można załadować i tworzy raport w oknie błędów, ale nie są wyświetlane w Menedżerze rozszerzeń.W takim przypadku można usunąć rozszerzenie usunięcie pliku z następującej lokalizacji, gdzie LocalAppData % jest zazwyczaj Nazwa_dysku: \Users\nazwa_użytkownika\AppData\Local:
LocalAppData %\Microsoft\VisualStudio\11.0\Extensions
Przykład
W tym przykładzie znajdzie pętli w relacji zależności między elementami.
To będzie sprawdzać poprawność zarówno na zapisywanie i sprawdzania poprawności polecenia menu.
/// <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;
}