Definiowanie zasad blokowania na potrzeby tworzenia segmentów tylko do odczytu
Interfejs API niezmienność z Visual Studio wizualizacji i modelowania SDK umożliwia programowi uzyskanie blokady części lub całości modelu domeny specyficzne dla języka (DSL) tak, że można odczytać ale nie zmienione.Opcja tylko do odczytu można, na przykład tak, że użytkownik może poprosić współpracowników do adnotacji i przegląd modelu DSL, ale uniemożliwić ich zmianę oryginał.
Dodatkowo, jako autor DSL, można zdefiniować blokowania zasad. Zasady blokowania definiuje blokad, które są dozwolone, nie jest dozwolone lub wymagane.Na przykład podczas publikowania DSL można zachęcić niezależnych producentów rozszerzyć z nowego polecenia.Ale można także użyć zasad blokady, aby uniemożliwić zmienianie status tylko do odczytu z określonej części modelu.
[!UWAGA]
Zasady blokowania może obchodzone przy użyciu odbicia.Zawiera jasne granicę dla deweloperów innych firm, ale nie zapewnia silne zabezpieczenia.
Więcej informacji i próbek są dostępne na Visual Studiowizualizacji i modelowania SDK witryny sieci Web.
Ustawianie i pobieranie blokady
Blokady można ustawić w magazynie, partycji lub poszczególnych elementów.Na przykład tej instrukcji uniemożliwi usuwany element modelu i również zapobiec jego właściwości przed zmianami:
using Microsoft.VisualStudio.Modeling.Immutability; ...
element.SetLocks(Locks.Delete | Locks.Property);
Inne wartości blokady, można zapobiec zmianom w relacji, Tworzenie elementu, ruch między partycjami i re-ordering łącza w roli.
Blokad stosuje się do działań użytkownika i do kodu programu.Jeśli kod program próbuje dokonać zmiany, InvalidOperationException będą generowane.Blokady są ignorowane w przypadku operacji Cofnij i ponów.
Można wykryć, czy element ma jakichkolwiek Zablokuj w danym zestawie, używając IsLocked(Locks) i bieżącego zestawu blokad dla elementu można uzyskać za pomocą GetLocks().
Można ustawić blokadę, bez korzystania z transakcji.Blokada bazy danych nie jest częścią magazynu.Jeśli ustawiono blokadę w odpowiedzi na zmianę wartości w magazynie, na przykład w OnValueChanged, należy zezwalać zmiany, które są częścią operacji Cofnij.
Metody te są metody rozszerzenia, które są zdefiniowane w Microsoft.VisualStudio.Modeling.Immutability obszaru nazw.
Blokuje na partycje i przechowuje
Blokad można również stosować do partycji i magazyn.Lock, który jest ustawiony na partycji stosuje się do wszystkich elementów w partycji.W związku z tym na przykład, poniższa instrukcja uniemożliwi wszystkie elementy w partycji usunięte, niezależnie od Państw własne blokad.Niemniej jednak inne blokuje takie jak Locks.Property wciąż być ustawione na poszczególne elementy:
partition.SetLocks(Locks.Delete);
Lock, ustawiona w magazynie stosuje się do wszystkich jego elementów, niezależnie od ustawienia tej blokady na partycje i elementy.
Za pomocą blokad
Blokady można użyć w celu wprowadzenia w życie programów, takich jak następujące przykłady:
Nie zezwalaj na zmiany do wszystkich elementów i relacje, z wyjątkiem tych, które reprezentują komentarze.Pozwala to użytkownikom na adnotacje modelu bez zmieniania go.
Nie zezwalaj na zmiany w domyślnej partycji, ale zezwalaj na zmiany w partycji diagramu.Użytkownika można zmienić układ diagramu, ale nie można zmieniać modelu źródłowego.
Nie zezwalaj na zmiany w magazynie, z wyjątkiem dla grupy użytkowników, którzy są zarejestrowani w oddzielnych baz danych.Dla innych użytkowników diagramu i modelu są tylko do odczytu.
Odrzucenia zmian do modelu, jeżeli właściwość logiczna diagramu jest ustawiona na wartość true.Zapewnia polecenie menu, aby zmienić właściwości.Pomaga to zapewnić użytkownikom, których nie należy wprowadzać zmian przypadkowo.
Uniemożliwić dodawanie i usuwanie elementów i relacje poszczególnych klas, ale zezwalaj na zmiany właściwości.Zapewnia to użytkownikom stały formularz, w którym można wypełnić właściwości.
Zablokuj wartości
Blokady można ustawić na magazyn, partycji lub ModelElement indywidualnych.Blokady jest Flags wyliczenie: można łączyć z jego wartości przy użyciu ' |'.
Blokady ModelElement zawsze obejmować blokad jego partycji.
Blokady partycji zawsze obejmować blokad magazynu.
Nie można ustawić blokadę na partycji lub przechowywania, a w tym samym czasie wyłączyć blokadę poszczególnych elementów.
Wartość |
Jeśli IsLocked(Value) ma wartość true |
---|---|
Brak |
Bez ograniczeń. |
Właściwość |
Nie można zmienić właściwości domeny elementów.To nie ma zastosowania do właściwości, które są generowane przez rolę klasy domeny w relacji. |
Dodaj |
Nowe elementy i łącza nie można utworzyć partycję lub przechowywania. Nie ma zastosowania do ModelElement. |
Przenoszenie |
Element nie może być przenoszona między partycje, jeśli element.IsLocked(Move) ma wartość true, lub jeśli targetPartition.IsLocked(Move) ma wartość true. |
Usuń |
Nie można usunąć elementu, jeśli ustawiono tę blokadę w samym elemencie lub na dowolne elementy, do których usunięcie będzie propagował, takich jak elementy osadzone i kształty. Można użyć element.CanDelete() do wykrywania, czy można usunąć elementu. |
Zmiana kolejności |
Nie można zmieniać kolejność łączy na roleplayer. |
RolePlayer |
Nie można zmienić zestaw łączy, które są zatrudniani na ten element.Na przykład nowe elementy nie mogą być osadzone pod tym elementem.Nie wpływa to na łącza, którego celem jest ten element. Jeśli ten element jest łączem, nie dotyczy jego źródłowym i docelowym. |
Wszystkie |
Wartość logiczną lub inne wartości. |
Zasady blokowania
Jako autor DSL, można zdefiniować blokowania zasad.Zasady blokowania łagodzi operacji SetLocks(), tak, że można zapobiec Ustaw lub mandatu określonego blokady musi być ustawiona szczególnych blokad.Zazwyczaj będzie zniechęcić użytkowników lub deweloperów z przypadkowo naruszeniem zamierzonego zastosowania DSL, w taki sam sposób, że można zadeklarować zmiennej za pomocą zasad blokady private.
Zasady blokowania umożliwia także ustawianie blokady na wszystkie elementy zależne od typu elementu.Wynika to z SetLocks(Locks.None) jest zawsze wywoływane, gdy element jest najpierw tworzone lub rozszeregowana z pliku.
Nie można jednak stosować zasadę podczas okresu istnienia, w zależności od blokad dla elementu.Do osiągnięcia tego efektu, należy użyć wywołania SetLocks().
Aby zdefiniować zasady blokowania, trzeba:
Tworzenie klasy implementującej ILockingPolicy.
Dodaj do tej klasy do usług, które są dostępne za pośrednictwem DocData z linii DSL.
Aby zdefiniować zasadę blokowania
ILockingPolicyma następującą definicję:
public interface ILockingPolicy
{
Locks RefineLocks(ModelElement element, Locks proposedLocks);
Locks RefineLocks(Partition partition, Locks proposedLocks);
Locks RefineLocks(Store store, Locks proposedLocks);
}
Metody te są wywoływane, gdy wywołanie do SetLocks() na magazyn, partycji lub element modelu.W każdej metodzie są dostarczane z proponowanych zestaw blokad.Można zwrócić zestaw proponowanych lub można dodawać i odejmować blokad.
Na przykład:
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Immutability;
namespace Company.YourDsl.DslPackage // Change
{
public class MyLockingPolicy : ILockingPolicy
{
/// <summary>
/// Moderate SetLocks(this ModelElement target, Locks locks)
/// </summary>
/// <param name="element">target</param>
/// <param name="proposedLocks">locks</param>
/// <returns></returns>
public Locks RefineLocks(ModelElement element, Locks proposedLocks)
{
// In my policy, users can never delete an element,
// and other developers cannot easily change that:
return proposedLocks | Locks.Delete);
}
public Locks RefineLocks(Store store, Locks proposedLocks)
{
// Only one user can change this model:
return Environment.UserName == "aUser"
? proposedLocks : Locks.All;
}
Aby upewnić się, że użytkownicy zawsze można usunąć elementy, nawet jeśli inne kod wywoła funkcjęSetLocks(Lock.Delete):
return proposedLocks & (Locks.All ^ Locks.Delete);
Aby uniemożliwić zmiany we właściwościach każdego elementu MojaKlasa:
return element is MyClass ? (proposedLocks | Locks.Property) : proposedLocks;
Aby udostępnić swoje polityki jako usługi
W sieci DslPackage projektu, należy dodać nowy plik, który zawiera kod podobny do poniższego:
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Immutability;
namespace Company.YourDsl.DslPackage // Change
{
// Override the DocData GetService() for this DSL.
internal partial class YourDslDocData // Change
{
/// <summary>
/// Custom locking policy cache.
/// </summary>
private ILockingPolicy myLockingPolicy = null;
/// <summary>
/// Called when a service is requested.
/// </summary>
/// <param name="serviceType">Service requested</param>
/// <returns>Service implementation</returns>
public override object GetService(System.Type serviceType)
{
if (serviceType == typeof(SLockingPolicy)
|| serviceType == typeof(ILockingPolicy))
{
if (myLockingPolicy == null)
{
myLockingPolicy = new MyLockingPolicy();
}
return myLockingPolicy;
}
// Request is for some other service.
return base.GetService(serviceType);
}
}