Definování zásady zamykání pro vytváření segmentů jen pro čtení
Z rozhraní API Immutability Visual Studio vizualizaci a modelování SDK umožňuje aplikaci lock části nebo celého modelu domény specifické pro jazyk (DSL) tak, aby jej číst ale nezmění.Tato možnost jen pro čtení nelze použít, například tak, aby uživatel požádat kolegy poznámkami a zkontrolujte DSL model, ale je možné zakázat měnit původní.
Kromě toho jako autor DSL, můžete definovat uzamčení zásad. Uzamčení zásad definuje zámky, které jsou povolené, není povoleno nebo povinné.Při publikování DSL můžete například podporovat vývojářů třetích stran rozšířit nové příkazy.Ale můžete také použít uzamčení zásad zabránit jejich změna stavu jen pro čtení určené součásti modelu.
[!POZNÁMKA]
Uzamčení zásad může být obcházeno pomocí odrazu.Vymazat ohraničení poskytuje vývojářům třetích stran, ale neposkytuje silného zabezpečení.
Další informace a vzorky, které jsou k dispozici Visual Studiovizualizaci a modelování SDK webu.
Nastavení a získání uzamčení
Můžete nastavit uzamčení úložiště, oddílu nebo jednotlivý prvek.Tento příkaz například zabránit odstranění prvku modelu a také zabránit jeho vlastnosti změně:
using Microsoft.VisualStudio.Modeling.Immutability; ...
element.SetLocks(Locks.Delete | Locks.Property);
Jiné hodnoty uzamčení lze zabránit změnám v vztahy, vytvoření prvku, pohyb mezi oddíly a re-ordering odkazy v roli.
Zámky se vztahuje na akce uživatele a kód programu.Pokud kód program pokusí provést změny, InvalidOperationException bude vyvolána.Zámky jsou ignorovány v operaci zpět nebo znovu.
Můžete zjistit, zda má element žádné uzamčení dané sadě pomocí IsLocked(Locks) a aktuální nastavení uzamčení v prvku lze získat pomocí GetLocks().
Bez použití transakce můžete nastavit uzamčení.Uzamčení databáze není součástí úložiště.Pokud nastavíte zámek v reakci na změnu hodnoty v úložišti, například v OnValueChanged, byste měli povolit změny, které jsou součástí operace zpět.
Tyto metody jsou metody rozšíření, které jsou definovány v Microsoft.VisualStudio.Modeling.Immutability oboru názvů.
Zámky na oddíly a úložišť
Zámky lze také použít oddíly a úložiště.Zámek, který je nastaven na oddíl se vztahuje na všechny prvky v oddílu.Proto například následující příkaz bude zabránit všechny prvky v oddílu odstranění, bez ohledu na státy vlastní uzamčení.Nicméně ostatní uzamkne jako Locks.Property nelze nastavit stále na jednotlivé prvky:
partition.SetLocks(Locks.Delete);
Uzamčení nastavené na obchodu se vztahuje na všechny jeho části, bez ohledu na nastavení uzamčení na oddíly a prvky.
Pomocí zámků
Provádění systémů, jako jsou například následující příklady můžete použít uzamčení:
Zakažte změny na všechny prvky a vztahy s výjimkou těch, které představují komentáře.To umožňuje uživatelům vkládat modelu bez provedení změn.
Zakázat změny výchozího oddílu, ale povolit změny v oddílu diagramu.Uživatele můžete změnit uspořádání diagram, nemohou však měnit podkladového modelu.
Zakažte změny úložiště s výjimkou pro skupinu uživatelů, kteří jsou registrováni v samostatné databázi.Ostatní uživatelé diagramu a modelu jsou jen pro čtení.
Zakázat změny modelu booleovská vlastnost diagramu nastavena na hodnotu true.Zadejte příkaz nabídky změnit vlastnosti.Díky tomu uživatelé, které mohou provést změny omylem.
Zakázat přidání a odstranění prvků a vztahů určitých tříd, ale umožnit změny vlastností.To poskytuje uživatelům pevné formulář, ve kterém jsou vlastnosti výplně.
Zámek hodnoty
Zámky lze nastavit na úložiště, oddílu nebo jednotlivé ModelElement.Uzamčení je Flags výčtu: lze kombinovat pomocí hodnoty "|".
Zámky ModelElement vždy obsahovat zámky jeho oddíl.
Zámky oddíl vždy obsahovat zámky úložiště.
Nelze nastavit uzamčení na oddíl nebo ukládat a zároveň zakázat uzamčení jednotlivých prvků.
Value |
Což znamená, že pokud IsLocked(Value) je PRAVDA |
---|---|
Žádná |
Bez omezení. |
Property |
Nelze změnit vlastnosti domény prvků.To se nevztahuje na vlastnosti, které jsou generovány roli domény třídy ve vztahu. |
Přidejte |
Nelze vytvořit nové prvky a odkazy v oddílu nebo uložit. Netýká se ModelElement. |
Přesunout |
Prvek nelze přesouvat mezi oddíly, pokud element.IsLocked(Move) je PRAVDA, nebo pokud targetPartition.IsLocked(Move) je PRAVDA. |
Odstranit |
Prvek nelze odstranit, pokud toto uzamčení je nastavena v prvku samotném nebo na jakékoli prvky, které by odstranění rozšíření, jako vložené prvky a tvary. Můžete použít element.CanDelete() zjistit, zda je možné odstranit element. |
Změna pořadí |
Nelze změnit pořadí odkazů na roleplayer. |
RolePlayer |
Sadu odkazů, které jsou na tento prvek získání nelze změnit.Například nelze vložit nové prvky v rámci tohoto prvku.Odkazy, pro které je tento prvek cíl nemá vliv. Pokud tento prvek je odkaz, jeho zdrojové a cílové neovlivní. |
Všechna |
Bitový operátor OR jiných hodnot. |
Zásady uzamčení
Jako autor DSL můžete definovat uzamčení zásad.Uzamčení zásad zahájil operaci SetLocks(), takže můžete zabránit uzamčení určitých nastavit nebo pověřit konkrétní zámky nastavil.Obvykle by pomocí zásad uzamčení Zabraňte uživatelům a vývojářům z náhodně nedbalostním zamýšlené použití DSL, stejným způsobem deklarovat proměnnou private.
Uzamčení zásad můžete také nastavit uzamčení na všechny prvky závislé na typu prvku.Důvodem je, že SetLocks(Locks.None) se nazývá vždy při první prvek vytvoření nebo rekonstruovat ze souboru.
Pomocí zásad však nelze měnit uzamčení v prvku během svého života.Dosáhnout tohoto efektu, je třeba použít volání na SetLocks().
Chcete-li definovat zásady uzamčení, musíte:
Vytvořit třídu, která implementuje ILockingPolicy.
Přidáte služby, které jsou k dispozici prostřednictvím DocData vaše linek této třídy.
K definování zásad uzamčení
ILockingPolicymá následující definice:
public interface ILockingPolicy
{
Locks RefineLocks(ModelElement element, Locks proposedLocks);
Locks RefineLocks(Partition partition, Locks proposedLocks);
Locks RefineLocks(Store store, Locks proposedLocks);
}
Tyto metody se nazývají při volání SetLocks() na úložiště, oddílu nebo ModelElement.V každé metody jsou k dispozici navrhované sadu zámků.Navrhované sadu lze vrátit nebo můžete přidat a odebrat uzamčení.
Příklad:
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;
}
Přesvědčte se, zda mohou uživatelé vždy odstranit elementy, i když ostatní kódu voláníSetLocks(Lock.Delete):
return proposedLocks & (Locks.All ^ Locks.Delete);
Chcete-li zakázat změny vlastností každého prvku MyClass:
return element is MyClass ? (proposedLocks | Locks.Property) : proposedLocks;
K dispozici jako služba Zásady
Ve vaší DslPackage projektu, přidejte nový soubor, který obsahuje kód, který následujícímu příkladu:
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);
}
}