Aracılığıyla paylaş


Salt okunur segmentleri oluşturmak için bir kilitleme ilkesi tanımlama

Immutability API, Visual Studio görselleştirme ve modelleme sdk verir kilit parçası veya tüm etki alanına özgü dil (dsl) modelinin bir programa böylece okuma ancak değişmemiş.Bir kullanıcı düzenleyebilir ve dsl modelini gözden geçirmek için çalışma arkadaşları isteyebilir, ancak bunları özgün değiştirmesini engelleyebilirsiniz Bu salt okunur seçeneği, örneğin, kullanılabilir.

Ayrıca, dsl, Yazar olarak tanımlayan bir kilitleme ilkesi. Hangi kilitleri izin verilen, verilmeyen veya zorunlu bir kilitleme ilkesi tanımlar.Örneğin, bir dsl yayımladığınızda, üçüncü parti geliştiriciler yeni komutları ile genişletmek için teşvik.Ancak belirtilen modelin parçalarını salt okunur durumunu değiştirme önlemek için kilitleme ilkesini de kullanabilirsiniz.

[!NOT]

Yansıtma kullanarak kilitleme ilkesi atlatılabilir.Üçüncü parti geliştiriciler için açık bir sınır sağlar, ancak güçlü bir güvenlik sağlamaz.

Daha fazla bilgi ve örnekler yok Visual Studiogörselleştirme ve modelleme sdk Web sitesi. 

Ayarlama ve kilitleri alınıyor

Kilitler, depo, bölüm veya tek bir öğesine ayarlayabilirsiniz.Örneğin, bu ifade, bir modeli öğe silinmesini önlemek ve değiştirilmesini özelliklerini de engeller:

using Microsoft.VisualStudio.Modeling.Immutability; ...
element.SetLocks(Locks.Delete | Locks.Property);

Diğer kilit değerleri, ilişkiler, öğe oluşturma, bölümler ve rol re-ordering bağlantılar arasında hareket değişiklikleri engellemek için kullanılabilir.

Kullanıcı eylemleri ve program kodu kilitleri uygulanır.Program kodu bir değişiklik yapma girişiminde, bir InvalidOperationException atılan.Kilitleri geri alma veya yineleme işleminde dikkate alınmaz.

Öğenin herhangi bir kilit belirli bir kümesi kullanarak sahip olup olmadığını bulmak IsLocked(Locks) ve geçerli öğe üzerindeki kilitleri kümesi kullanarak elde GetLocks().

Bir hareket kullanmadan kilit ayarlayabilirsiniz.Kilit veritabanı deposu bir parçası değildir.Kilit yanıt olarak bir değer değişikliği deposunda ayarlarsanız, örneğin OnValueChanged, geri alma işleminin parçası olan değişiklikleri izin vermelisiniz.

Bu yöntemler içinde tanımlanan uzantısı yöntemlerdir Microsoft.VisualStudio.Modeling.Immutability ad.

Ff521896.collapse_all(tr-tr,VS.110).gifBölümler üzerinde kilitler ve depolar

Bölümler ve depo kilitleri de uygulanabilir.Bir bölüme belirlediği kilit bölümündeki tüm öğelere uygulanır.Bu nedenle, örneğin, aşağıdaki ifadeyi bir bölümünde tüm öğeleri, kendi kilitleri durumlarına bakılmaksızın silinmesini engeller.Yine de, diğer gibi kilit Locks.Property yine de tek tek öğeleri üzerinde ayarlanabilir:

partition.SetLocks(Locks.Delete);

Deposu'nda belirlediği kilit tüm öğeleri bölümleri ve öğeleri bu kilidin ayarlarını bağımsız olarak uygulanır.

Ff521896.collapse_all(tr-tr,VS.110).gifKilitler kullanmaktan

Aşağıdaki örneklerde olduğu gibi şemaları uygulamak için kilitleri kullanabilirsiniz:

  • Tüm öğeleri ve ilişkileri açıklamaları temsil eden olanlar dışında değişiklik izin vermez.Bu model değiştirmeden ek açıklama eklemek kullanıcılar sağlar.

  • Varsayılan bölümü değişikliklere izin vermez, ancak Diyagram bölümünde değişiklik izin.Kullanıcı diyagramı yeniden düzenleyebilirsiniz, ancak temel modeli değiştiremezler.

  • Değişiklik için ayrı bir veritabanında kayıtlı kullanıcı grubu dışında deposuna izin vermez.Diğer kullanıcılar için salt okunur Diyagram ve modeli.

  • Diyagramın bir Boolean özelliği ayarlanmışsa, model değişiklikleri engellemek için true.Bu özelliği değiştirmek için bir menü komutunu sağlar.Bu, yaptıkları olmayan kullanıcılar değişiklikleri yanlışlıkla sağlamaya yardımcı olur.

  • Toplama ve öğeleri silme ve ilişkileri belirli sınıflarının izin vermez, ancak özellik değişikliklerine izin.Bu kullanıcılar özelliklerini doldurabilirsiniz için sabit bir form sağlar.

Kilit değerleri

Kilitler, depo, bölüm veya tek tek ModelElement ayarlanabilir.Kilitleri olan bir Flags numaralandırma: değerlerini kullanarak birleştirebilirsiniz ' |'.

  • Bir ModelElement kilitleri kilit kendi bölümünün her zaman içerir.

  • Kilit bir bölümünün her zaman deposunun kilitleri içerir.

Kilit bir bölüme ayarlayın veya depolamak ve aynı anda tek bir öğe üzerinde kilidi devre dışı bırakmak olamaz.

Value

Yani, IsLocked(Value) doğrudur

None

Sınırlama yok.

Özellik

Öğelerin etki alanı özellikleri değiştirilemez.Bu bir etki alanı sınıfta bir ilişki rolü tarafından oluşturulan özellikler için geçerli değildir.

Ekle

Yeni öğeler ve bağlantılar bölümü oluşturulamıyor veya saklama.

Uygulanabilir değil ModelElement.

Taşıma

Öğe, bölümler arasında taşınamaz element.IsLocked(Move) doğrudur, veya targetPartition.IsLocked(Move) doğrudur.

Sil

Bu kilit öğesinde ayarlayın ya da hangi öğeleri üzerinde silme, katıştırılmış öğeler ve şekiller gibi yayar öğe silinemez.

Kullanabileceğiniz element.CanDelete() bir öğeyi Silinmiş olup olmadığını bulmak için.

Yeniden sıralama

Bağlantılara bir roleplayer sırası değiştirilemez.

RolePlayer

Bu öğe kaynaklanan bağlantı kümesini değiştirilemez.Örneğin, yeni öğelerin bu öğenin altında gömülemez.Bu öğe için hedef olduğu bağlantıları etkilemez.

Bu öğe bir bağlantıysa, kaynak ve hedef etkilenmez.

Tümü

Bitsel or değerler.

Kilitleme ilkeleri

dsl Yazar olarak, sizin tanımladığınız bir kilitleme ilkesi.Özel kilit ayarlamak veya belirli kilitleri ayarlanmalıdır gerçekletirilmesi olan önlemek olduğunu SetLocks(), işlem kilitleme ilkesi moderates.Kullanıcılar ya da yanlışlıkla bir değişken bildirebildiğinizi fark aynı şekilde kullanım amacını bir dsl contravening dan geliştiriciler vazgeçirmek için kilitleme ilkesi genellikle, kullanacağınız private.

Kilitleme ilkesi, tüm öğeleri üzerinde kilit öğe türüne bağlı olarak ayarlamak için de kullanabilirsiniz.Bu, çünkü SetLocks(Locks.None) her zaman bir öğe ilk oluşturulduğunda veya dosyadan serisi denir.

Ancak, öğe üzerindeki kilitlerin ömrü sırasında farklı bir ilke kullanamazsınız.Bu etkiyi elde etmek için yapılan çağrıların kullanması gereken SetLocks().

Kilitleme ilkesini tanımlamak için gerekir:

  • Uygulayan bir sınıf oluşturmak ILockingPolicy.

  • Bu sınıf dsl DocData kullanılabilen hizmetler ekleyin.

Ff521896.collapse_all(tr-tr,VS.110).gifKilitleme ilkesini tanımlamak için

ILockingPolicyAşağıdaki tanım vardır:

  public interface ILockingPolicy
  {
    Locks RefineLocks(ModelElement element, Locks proposedLocks);
    Locks RefineLocks(Partition partition, Locks proposedLocks);
    Locks RefineLocks(Store store, Locks proposedLocks);
  }

Bir arama yapıldığında bu yöntem çaðrýlýr SetLocks() deposu, bölüm veya ModelElement.Her yöntemdeki önerilen kilitleri kümesi ile sağlanır.Önerilen kümesi döndürebilir veya ekleme ve çıkarma kilitleri.

Örne?in:

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

Diğer kod çağırır bile, kullanıcılar her zaman öğeleri silme emin olmak içinSetLocks(Lock.Delete):

return proposedLocks & (Locks.All ^ Locks.Delete);

Değişim'MyClass [NULL]'ın her öğenin tüm özelliklerini de engellemek için:

return element is MyClass ? (proposedLocks | Locks.Property) : proposedLocks;

Ff521896.collapse_all(tr-tr,VS.110).gifİlkenizin bir hizmet olarak kullanılabilir duruma getirmek için

İçinde sizin DslPackage proje, aşağıdaki örnektekine benzer bir kod içeren yeni bir dosya ekleme:

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