Sdílet prostřednictvím


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);
    }
}