Aracılığıyla paylaş


Kuralları modelindeki değişiklikleri yaymak

Bir değişikliği bir öğeden diğerine görselleştirme ve modelleme sdk (vmsdk) yaymak için bir depo kural oluşturabilirsiniz.Deposunda herhangi bir öğe için bir değişiklik meydana geldiğinde, kurallar genellikle en dıştaki işlem tamamlandığında, yürütülmek üzere zamanlanır.Farklı türde bir öğe ekleme veya silme gibi olaylar, kuralları farklı türleri vardır.Öğeleri, şekiller veya diyagramlar belirli türleri için kurallar ekleyebilirsiniz.Birçok yerleşik özellikler kurallar tarafından tanımlanır: Örneğin, kurallar modeli değiştiğinde bir diyagram güncelleştirildiğinden emin olun.Etki alanına özgü dilinizi kendi kurallarınızı ekleyerek özelleştirebilirsiniz.

Depolama kuralları deposu – yani içinde değişiklikleri yayılıyor, modeli öğeleri, ilişkilerini, şekiller veya bağlayıcılar ve kendi etki alanı özelliklerini değiştirir için özellikle yararlı olur.Kullanıcı Geri Al veya Yinele komutlarını çalıştırdığında kuralları çalışmaz.Bunun yerine, Hareket Yöneticisi deposunun içeriğini doğru duruma geri yüklenir emin olur.Kaynak deposu dışında değişiklikleri yaymak olayları depolamak kullanın.Daha fazla bilgi için bkz. Olay işleyicilerini modeli dışında değişiklikleri yaymak.

Örneğin, kullanıcı (veya kodunuzu) ExampleDomainClass türde yeni bir öğe oluşturduğunda, ek öğe başka bir model başka bir bölümünde oluşturulur belirtmek istediğinizi varsayalım.Bir AddRule yazmak ve ExampleDomainClass ile ilişkilendirin.Ek öğe yaratmak için kural kodu yazarsınız.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.Modeling;

namespace ExampleNamespace
{
 // Attribute associates the rule with a domain class:
 [RuleOn(typeof(ExampleDomainClass), FireTime=TimeToFire.TopLevelCommit)]
 // The rule is a class derived from one of the abstract rules:
 class MyAddRule : AddRule
 {
  // Override the abstract method:
  public override void ElementAdded(ElementAddedEventArgs e)
  {
    base.ElementAdded(e);
    ExampleDomainClass element = e.ModelElement;
    Store store = element.Store;
    // Ignore this call if we're currently loading a model:
    if (store.TransactionManager.CurrentTransaction.IsSerializing) 
       return;
    
    // Code here propagates change as required – for example:
      AnotherDomainClass echo = new AnotherDomainClass(element.Partition);
      echo.Name = element.Name;
      echo.Parent = element.Parent;  
    }
  }
 // The rule must be registered:
 public partial class ExampleDomainModel
 {
   protected override Type[] GetCustomDomainModelTypes()
   {
     List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
     types.Add(typeof(MyAddRule));
     // If you add more rules, list them here. 
     return types.ToArray();
   }
 }
}

[!NOT]

Kural kodunu depo içindeki öğeler yalnızca durumunu değiştirmeniz gerekir; diğer bir deyişle, kuralın yalnızca modeli öğeleri, ilişkilerini, şekiller, bağlayıcılar, diyagramları veya özelliklerini değiştirmeniz gerekir.Kaynak deposu dışında değişiklikleri yaymak istiyorsanız, olayları depolamak tanımlayın.Daha fazla bilgi için bkz. Olay işleyicilerini modeli dışında değişiklikleri yaymak

Bir kural tanımlamak için

  1. Bir sınıf ile öneki olarak kural tanımlamak RuleOn özniteliği.Öznitelik kural biri etki alanı sınıfları, ilişkileri veya diyagram öğeleri ile ilişkilendirir.Soyut bu sınıfın her örneği için kural uygulanır.

  2. Kural kümesi tarafından döndürülen ekleyerek kaydetmek GetCustomDomainModelTypes() etki alanı modeli sınıfında.

  3. Kural sınıfı soyut kural sınıflarından birinden türer ve yürütme yönteminin kodu yazacaksınız.

Aşağıdaki bölümlerde daha ayrıntılı adımları açıklanmaktadır.

Bir kural bir etki alanı sınıfını tanımlamak için

  • Özel kod dosyasında bir sınıf tanımlamak ve önüne RuleOnAttribute özniteliği:

    [RuleOn(typeof(ExampleElement), 
         // Usual value – but required, because it is not the default:
         FireTime = TimeToFire.TopLevelCommit)] 
    class MyRule ...
    
  • Birinci parametre, özne türü etki alanı sınıf, etki alanı ilişkisi, Şekil, bağlayıcı veya diyagram olabilir.Genellikle, etki alanı sınıfları ve ilişkiler için kurallar.

    The FireTime is usually TopLevelCommit.Bu kural yalnızca tüm birincil işlem yapılan değişiklikler sonra yürütülür sağlar.Alternatifler değişiklikten hemen sonra kural yürütür satır içi şunlardır; ve yürütür (en dıştaki olmayabilir) geçerli hareket sonunda kural LocalCommit.Ayrıca sırada sipariş etkilemek için kural önceliğini ayarlayabilirsiniz, ancak bu duyduğunuz sonucu elde etmek için güvenilir bir yöntem.

  • Soyut bir sınıf özne türü belirtebilirsiniz.

  • Kural konu sınıfın tüm örnekleri için geçerlidir.

  • Varsayılan değeri FireTime TimeToFire.TopLevelCommit olur.Bu kural, en dıştaki işlem tamamlandığında yürütülecek neden olur.TimeToFire.Inline bir alternatifidir.Bu tetikleyici olayından hemen sonra yürütülecek kural neden olur.

Kural kaydetmek için

  • Kural sınıfınızın tarafından döndürülen türleri listesine eklemek GetCustomDomainModelTypes , etki alanı modeliniz:

    public partial class ExampleDomainModel
     {
       protected override Type[] GetCustomDomainModelTypes()
       {
         List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
         types.Add(typeof(MyAddRule));
         // If you add more rules, list them here. 
         return types.ToArray();
       }
     }
    
  • Etki alanı modeli sınıfınızın adını emin değilseniz, dosya içinde aramaDsl\GeneratedCode\DomainModel.cs

  • dsl projenize özel kod dosyasında bu kodu yazın.

Kural kodunu yazmak için

  • Kural sınıfı bir aşağıdaki temel sınıflar türetmek:

    Temel sınıf

    Trigger

    AddRule

    Bir öğe, bağlantı veya şekil eklenir.

    Bu, yeni ilişkiler, yeni öğelere ek olarak algılamak için kullanın.

    ChangeRule

    Etki alanı özelliği değeri değiştirilir.Yöntem bağımsız değişkenleri, eski ve yeni değerleri sağlar.

    Bu kuralın tetiklediği şekiller için yerleşik AbsoluteBounds özellik değişikliklerini Şekil taşınırsa.

    Çoğu durumda, geçersiz kılmak daha kullanışlı olan OnValueChanged veya OnValueChanging işleyicisinde özelliği.Bu yöntemler, hemen önce ve sonra değişikliği olarak adlandırılır.Bunun aksine, kural, genellikle işlemin sonunda çalışır.Daha fazla bilgi için bkz. Etki alanı özelliği değeri değişikliği işleyicileri.

    NotNot
    Bu kural, bir bağlantı oluşturulduğunda veya tetiklenmez.Bunun yerine, yazma bir AddRule ve bir DeleteRule için etki alanı ilişkisi.

    DeletingRule

    Bir öðe ya da bağlantı silinmek üzere olduğunda tetiklenir.ModelElement.IsDeleting özelliği, işlemin sonuna kadar geçerlidir.

    DeleteRule

    Bir öðe ya da bağlantı silindiğinde gerçekleşecek.Kural, DeletingRules dahil olmak üzere tüm diğer kurallardan yürütüldüğü sonra yürütülür.ModelElement.IsDeleting yanlış ve ModelElement.IsDeleted doğrudur.Bir sonraki geri alma için izin vermek için öğe aslında bellekten kaldırılmaz, ancak Store.ElementDirectory ' kaldırılır.

    MoveRule

    Bir öğeyi bir mağaza bölümünden diğerine taşınır.

    (Bu bir şekli grafik konumunu bulunmadığı dikkat edin.)

    RolePlayerChangeRule

    Bu kural yalnızca etki alanı ilişkilerini uygulanır.İki ucundan birinde bir bağlantı için bir model öğesi açıkça atarsanız tetiklenir.

    RolePlayerPositionChangeRule

    Bağlantılar için veya bir öğe sıralama MoveBefore veya MoveToIndex yöntemlerini kullanarak bir bağlantıyı değiştirildiğinde harekete.

    TransactionBeginningRule

    Bir hareket oluşturulduğu sırada yürütülür.

    TransactionCommittingRule

    İşlem yaklaşık olarak kaydedilmiş olduğunda yürütülür.

    TransactionRollingBackRule

    İşlem yaklaşık geri alınmasını olduğunda yürütülür.

  • Her sınıf, geçersiz kılma yöntemi vardır.Tür override bulması için sınıfta.Bu yöntemin parametresi olarak değiştiriliyor öğesi tanımlar.

Kuralları hakkında aşağıdaki noktalara dikkat edin:

  1. Bir işlemde değişiklik kümesini bir çok kural tetikleyebilir.Genellikle, en dıştaki işlem tamamlandığında kurallar yürütülür.Bunlar, belirlenemeyen bir sırayla yürütülür.

  2. Bir kural, bir işlem içinde her zaman çalıştırılır.Bu nedenle, değişiklik yapmak için yeni bir hareket oluşturmak gerekmez.

  3. Kuralları bir işlem geri alınır veya geri al veya Yinele işlemleri yapılırken yürütülmez.Bu işlemler deposu tüm içeriği önceki durumuna sıfırlamak.Kuralınız deposu dışında herhangi bir şey durumu değişirse, bu nedenle, onu synchronism deposu ile içerik tutmak değil.Mağaza dışında durumu güncelleştirmek için olayları kullanmak daha uygundur.Daha fazla bilgi için bkz. Olay işleyicilerini modeli dışında değişiklikleri yaymak.

  4. Bir modeli dosyadan yüklendiğinde bazı kurallar yürütülür.Yükleme ya da kaydetme sürmekte olup olmadığını belirlemek için store.TransactionManager.CurrentTransaction.IsSerializing.

  5. Kural kodunu daha fazla kural Tetikleyiciler oluşturursa, bunlar Açmadığınızda listenin sonuna eklenir ve hareket tamamlanmadan önce yürütülür.DeletedRules tüm diğer kurallardan sonra yürütülür.Bir kural, bir işlemdeki her değişiklik için bir kez birçok kez çalıştırabilirsiniz.

  6. Gelen kuralları ve bilgi aktarmak için bilgileri depolayabilir TransactionContext.Bu işlem sırasında tutulan yalnızca bir sözlüktür.İşlem sona erdiğinde atıldı.Her kuralın olay bağımsız erişimi sağlar.Kurallar içinde önceden bilinebilir bir sırada yürütülür değil unutmayın.

  7. Diğer alternatifler düşünüyor sonra kuralları kullanın.Örneğin, bir özelliğe bir değer değiştiğinde güncelleştirmek istiyorsanız, hesaplanmış bir özelliği kullanmayı düşünün.Boyut ve konum bir şeklin sınırlamak isterseniz, kullanmak bir BoundsRule.Özellik değeri bir değişiklik yanıt vermek istiyorsanız, ekleme bir OnValueChanged özellik işleyicisi.Daha fazla bilgi için bkz. Yanıtlama ve değişiklikleri yayılıyor.

Örnek

Aşağıdaki örnek, iki öğe bağlamak için bir etki alanı ilişkisi örneği başlatıldığında bir özelliğini günceller.Program kodu bir bağlantı oluşturur, yalnızca kullanıcı bir bağlantıyı bir Diyagram üzerinde de oluşturduğunda, kural tetikledi.

Bu örneği test etmek için görev akış çözümü şablonu kullanarak bir dsl oluşturun ve Dsl proje dosyasında aşağıdaki kodu ekleyin.Yapı ve çözüm çalıştırın ve hata ayıklama projede örnek dosyasını açın.Yorum bağlantıyı yorum şeklinde bir akış öğesi arasında çizin.Kendisine bağlı en son öğe üzerindeki raporunda yorum değişir.

Uygulamada, her AddRule için genellikle bir DeleteRule yazarsınız.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.Modeling;

namespace Company.TaskRuleExample
{

  [RuleOn(typeof(CommentReferencesSubjects))]
  public class RoleRule : AddRule
  {

    public override void ElementAdded(ElementAddedEventArgs e)
    {
      base.ElementAdded(e);
      CommentReferencesSubjects link = e.ModelElement as CommentReferencesSubjects;
      Comment comment = link.Comment;
      FlowElement subject = link.Subject;
      Transaction current = link.Store.TransactionManager.CurrentTransaction;
      // Don't want to run when we're just loading from file:
      if (current.IsSerializing) return;
      comment.Text = "Flow has " + subject.FlowTo.Count + " outgoing connections";
    }
    
  }

  public partial class TaskRuleExampleDomainModel
  {
    protected override Type[] GetCustomDomainModelTypes()
    {
      List<Type> types = new List<Type>(base.GetCustomDomainModelTypes());
      types.Add(typeof(RoleRule));
      return types.ToArray();
    }
  }

}

Ayrıca bkz.

Kavramlar

Olay işleyicilerini modeli dışında değişiklikleri yaymak

BoundsRules şekli konumunu ve boyutunu sınırlamak