Aracılığıyla paylaş


DSL Kodunu Anlama

Etki Alanına Özgü Dil (DSL) çözümü, Visual Studio'da DSL örneklerini okumak ve güncelleştirmek için kullanabileceğiniz bir API oluşturur. Bu API, DSL tanımından oluşturulan kodda tanımlanır. Bu konu başlığında oluşturulan API açıklanmaktadır.

Örnek çözüm: Bileşen Diyagramları

Bu konudaki örneklerin çoğunun kaynağı olan çözümü oluşturmak için Bileşen Modelleri çözüm şablonundan bir DSL oluşturun. Bu, yeni bir DSL çözümü oluşturduğunuzda görüntülenen standart şablonlardan biridir.

Not

Bileşen Diyagramları DSL şablonu, Etki Alanına Özgü Dil Tasarımcısı olarak adlandırılır.

Bu çözüm şablonunu bilmiyorsanız F5 tuşuna basın ve deneme yapın. Özellikle bir bağlantı noktası aracını bir bileşene sürükleyerek bağlantı noktaları oluşturduğunuza ve bağlantı noktalarını bağlayabileceğinize dikkat edin.

Bileşenler ve birbirine bağlı bağlantı noktaları

DSL Çözümünün Yapısı

Dsl projesi, DSL'niz için API'yi tanımlar. DslPackage projesi, Visual Studio ile nasıl tümleştirilmeyi tanımlar. Modelden oluşturulan kodu da içerebilen kendi projelerinizi de ekleyebilirsiniz.

Kod dizinleri

Bu projelerin her birindeki kodun çoğu Dsl\DslDefinition.dsl dosyasından oluşturulur. Oluşturulan kod, Oluşturulan Kod klasöründedir. Oluşturulan bir dosyayı görmek için, oluşturan .tt dosyasının yanındaki [+] öğesine tıklayın.

DSL'yi anlamanıza yardımcı olması için oluşturulan kodu incelemenizi öneririz. Oluşturulan dosyaları görmek için Çözüm Gezgini içindeki *.tt dosyalarını genişletin.

*.tt dosyaları çok az kod oluşturuyor. Bunun yerine, paylaşılan şablon dosyalarını eklemek için yönergeleri kullanırlar <#include> . Paylaşılan dosyalar \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\DSL SDK\DSL Designer\11.0\TextTemplates konumunda bulunabilir

DSL çözümüne kendi program kodunuzu eklediğinizde, bunu Oluşturulan Kod klasörünün dışında ayrı bir dosyaya ekleyin. Özel Kod klasörü oluşturmak isteyebilirsiniz. (Özel bir klasöre yeni bir kod dosyası eklediğinizde, ilk kod iskeletindeki ad alanını düzeltmeyi unutmayın.)

Çözümü yeniden oluştururken düzenlemeleriniz kaybolacağından, oluşturulan kodu doğrudan düzenlememenizi kesinlikle öneririz. Bunun yerine DSL'nizi özelleştirmek için:

  • DSL Tanımındaki birçok parametreyi ayarlayın.

  • Oluşturulan sınıflarda tanımlanan veya devralınan yöntemleri geçersiz kılmak için kısmi sınıfları ayrı kod dosyalarına yazın. Bazı durumlarda, oluşturulan bir yöntemi geçersiz kılabilmek için DSL Tanımında bir sınıfın Çift Türetilmiş Oluşturur seçeneğini ayarlamanız gerekir.

  • DSL Tanımı'nda oluşturulan kodun kendi kodunuz için 'kancalar' sağlamasına neden olan seçenekleri ayarlayın.

    Örneğin, bir etki alanı sınıfının Özel Oluşturucuya Sahip seçeneğini ayarlayıp çözümü derlerseniz hata iletileri görürsünüz. Bu hata iletilerinden birine çift tıkladığınızda, oluşturulan kodda özel kodunuzun sağlaması gerekenleri açıklayan açıklamalar görürsünüz.

  • Uygulamanıza özgü kod oluşturmak için kendi metin şablonlarınızı yazın. Şablonların birçok projede ortak olan bölümlerini paylaşmak için ekleme dosyalarını kullanabilir ve kendi dosya yapınızla başlatılan projeleri ayarlamak için Visual Studio proje şablonları oluşturabilirsiniz.

Dsl'de Oluşturulan Dosyalar

Dsl projesinde aşağıdaki oluşturulan dosyalar görüntülenir.

YourDsl Schema.xsd

DSL'nizin örneklerini içeren dosyaların şeması. Bu dosya derleme (bin) dizinine kopyalanır. DSL'nizi yüklediğinizde, model dosyalarının doğrulanabilmesi için bu dosyayı \Program Files\Microsoft Visual Studio 11.0\Xml\Schemas'a kopyalayabilirsiniz. Daha fazla bilgi için bkz . Etki Alanına Özgü Dil Çözümlerini Dağıtma.

DSL Gezgini'nde seçenekleri ayarlayarak serileştirmeyi özelleştirirseniz şema buna göre değişir. Ancak, kendi serileştirme kodunuzu yazarsanız, bu dosya artık gerçek şemayı temsil edemeyebilir. Daha fazla bilgi için bkz . Dosya Depolamayı ve XML Serileştirmeyi Özelleştirme.

ConnectionBuilders.cs

Bağlantı oluşturucu, ilişkileri oluşturan bir sınıftır. Bağlantı aracının arkasındaki koddur. Bu dosya, her bağlantı aracı için bir sınıf çifti içerir. Adları, etki alanı ilişkisinin ve bağlantı aracının adlarından türetilir: İlişkiOluşturucusu ve ConnectorToolConnectAction.

(Bileşen çözümü örneğinde, bağlantı oluşturucularından birine ConnectionBuilder, etki alanı ilişkisinin adı Connection olduğundan bu bir tesadüftür.)

İlişki, İlişkiBuilder.Connect() yönteminde oluşturulur. Varsayılan sürüm, kaynak ve hedef model öğelerinin kabul edilebilir olduğunu doğrular ve ardından ilişkiyi oluşturur. Örneğin:

CommentReferencesSubject(sourceAccepted, targetAccepted);

Her oluşturucu sınıfı, DSL Gezgini'ndeki Bağlantı Oluşturucuları bölümündeki bir düğümden oluşturulur. Bir Connect yöntem, bir veya daha fazla etki alanı sınıfı çifti arasında ilişkiler oluşturabilir. Her çift, DSL Gezgini'nde oluşturucu düğümü altında bulabileceğiniz bir Link Connect Yönergesi ile tanımlanır.

Örneğin, örnek DSL'deki üç ilişki türünün her biri için bir bağlantı oluşturucusu Bağlantı Bağlantısı Yönergeleri'ne ekleyebilirsiniz. Bu, kullanıcıya tek bir bağlantı aracı sağlar. Örnek olarak örneklene ilişkin ilişkinin türü, kullanıcı tarafından seçilen kaynak ve hedef öğelerin türlerine bağlıdır. Bağlantı Bağlantısı Yönergeleri eklemek için DSL Gezgini'nde bir oluşturucuya sağ tıklayın.

Belirli bir etki alanı ilişkisi türü oluşturulduğunda çalıştırılan özel kod yazmak için oluşturucu düğümü altında uygun Bağlantı Bağlantısı Yönergesini seçin. Özellikler penceresi Özel Bağlantı Kullanır'ı seçin. Çözümü yeniden derleyin ve ardından ortaya çıkan hataları düzeltmek için kod sağlayın.

Kullanıcı bu bağlantı aracını her kullandığında çalışan özel kod yazmak için bağlantı oluşturucusunun Özeldir özelliğini ayarlayın. Kaynak öğeye izin verilip verilmeyeceğine, belirli bir kaynak ve hedef bileşimine izin verilip verilmediğine ve bir bağlantı yapıldığında modelde hangi güncelleştirmelerin yapılması gerektiğine karar veren kod sağlayabilirsiniz. Örneğin, bağlantıya yalnızca diyagramda döngü oluşturmadığı durumlarda izin vekleyebilirsiniz. Tek bir ilişki bağlantısı yerine, kaynak ve hedef arasında birbiriyle ilişkili birkaç öğeden oluşan daha karmaşık bir desen örneği oluşturabilirsiniz.

Connectors.cs

Genellikle başvuru ilişkilerini temsil eden diyagram öğeleri olan bağlayıcıların sınıflarını içerir. Her sınıf DSL Tanımındaki bir bağlayıcıdan oluşturulur. Her bağlayıcı sınıfı BinaryLinkShape

Rengi ve diğer bazı stil özelliklerini çalışma zamanında değişken yapmak için DSL Tanımı diyagramında sınıfa sağ tıklayın ve Kullanıma Sunulan Ekle'nin üzerine gelin.

Çalışma zamanında ek stil özellikleri değişkeni yapmak için, örneğin TextField ve ShapeElementbölümüne bakın.

Diagram.cs

Diyagramı tanımlayan sınıfı içerir. ' den Diagramtüretilir.

Rengi ve diğer bazı stil özelliklerini çalışma zamanında değişken yapmak için DSL Tanımı diyagramında sınıfa sağ tıklayın ve Kullanıma Sunulan Ekle'nin üzerine gelin.

Ayrıca, bu dosya modele FixupDiagram yeni bir öğe eklendiğinde yanıt veren kuralı içerir. Kural yeni bir şekil ekler ve şekli model öğesine bağlar.

DirectiveProcessor.cs

Bu yönerge işlemcisi, kullanıcılarınızın DSL örneğinizi okuyan metin şablonları yazmasına yardımcı olur. Yönerge işlemcisi DSL'niz için derlemeleri (DLL' ler using ) yükler ve ad alanınız için deyimleri etkili bir şekilde ekler. Bu, metin şablonlarındaki kodun DSL'nizde tanımladığınız sınıfları ve ilişkileri kullanmasını sağlar.

Daha fazla bilgi için bkz . Etki Alanına Özgü Bir Dilden Kod Oluşturma ve Özel T4 Metin Şablonu Yönerge İşlemcileri Oluşturma.

DomainClasses.cs

Soyut sınıflar ve model kök sınıfı dahil olmak üzere tanımladığınız etki alanı sınıflarının uygulamaları. bunlar' dan ModelElementtüretilir.

Her etki alanı sınıfı şu içeriği içerir:

  • Her etki alanı özelliği için bir özellik tanımı ve iç içe işleyici sınıfı. OnValueChanging() ve OnValueChanged() geçersiz kılabilirsiniz. Daha fazla bilgi için bkz . Etki Alanı Özellik Değeri Değişiklik İşleyicileri.

    Örnek DSL'de sınıfı Comment bir özellik Text ve işleyici sınıfı TextPropertyHandleriçerir.

  • Bu etki alanı sınıfının katıldığı ilişkilerin erişimci özellikleri. (Rol özellikleri için iç içe sınıf yoktur.)

    Örnek DSL'de sınıfı, Comment ekleme ilişkisi ComponentModelHasCommentsaracılığıyla üst modeline erişen erişimcilere sahiptir.

  • Kurucular. Bunları geçersiz kılmak istiyorsanız etki alanı sınıfında Özel Oluşturucu Var seçeneğini belirleyin.

  • Öğe Grubu Prototype (EGP) işleyici yöntemleri. Kullanıcı başka bir öğeyi bu sınıfın örneklerine birleştirebiliyorsa (ekleyebiliyorsa) bunlar gereklidir. Genellikle kullanıcı bunu bir öğe aracından veya başka bir şekilden sürükleyerek veya yapıştırarak yapar.

    Örnek DSL'de, Bir Giriş Bağlantı Noktası veya Çıkış Bağlantı Noktası bir Bileşenle birleştirilebilir. Ayrıca, Bileşenler ve Açıklamalar modelle birleştirilebilir. VMExtensionProvisioningError hatasından dolayı

    Component sınıfındaki EGP işleyici yöntemleri, Bir Bileşenin Bağlantı Noktalarını kabul etmesine izin verir ancak Açıklamalar'ı kabul etmemektedir. Kök model sınıfındaki EGP işleyicisi Açıklamalar ve Bileşenler'i kabul eder ancak Bağlantı Noktaları'nı kabul etmemektedir.

    DomainModel.cs

    Etki alanı modelini temsil eden sınıf. ' den DomainModeltüretilir.

Not

Bu, modelin kök sınıfıyla aynı değildir.

Kopyalama ve Silme Kapanışları, bir öğe kopyalandığında veya silindiğinde dahil edilecek diğer öğeleri tanımlar. Bu davranışı, her ilişkinin her tarafındaki rollerin Kopyala ve Yayma Sil özelliklerini yayarak denetleyebilirsiniz. Değerlerin dinamik olarak belirlenmesini istiyorsanız, Kapatma sınıflarının yöntemlerini geçersiz kılmak için kod yazabilirsiniz.

DomainModelResx.resx

Bu, etki alanı sınıflarının ve özelliklerinin açıklamaları, özellik adları, araç kutusu etiketleri, standart hata iletileri ve kullanıcıya görüntülenebilen diğer dizeler gibi dizeleri içerir. Ayrıca, görüntü şekilleri için araç simgeleri ve görüntüler içerir.

Bu dosya, yerleşik derlemeye bağlıdır ve bu kaynakların varsayılan değerlerini sağlar. Kaynakların yerelleştirilmiş sürümünü içeren bir uydu derlemesi oluşturarak DSL'nizi yerelleştirebilirsiniz. Dsl yerelleştirilmiş kaynakla eşleşen bir kültüre yüklendiğinde bu sürüm kullanılır. Daha fazla bilgi için bkz . Etki Alanına Özgü Dil Çözümlerini Dağıtma.

DomainRelationships.cs

Modeldeki iki öğe arasındaki her bağlantı, etki alanı ilişki sınıfının bir örneğiyle temsil edilir. Tüm ilişki sınıfları öğesinden ElementLinktüretilir ve bu da öğesinden ModelElementtüretilir. Bu bir ModelElement olduğundan, bir ilişkinin örneği özelliklere sahip olabilir ve bir ilişkinin kaynağı veya hedefi olabilir.

HelpKeywordHelper.cs

Kullanıcı F1 tuşuna bastığında kullanılan işlevler sağlar.

MultiplicityValidation.cs

1..1 veya 1...* çokluğunu belirttiğiniz ilişki rollerinde, kullanıcı ilişkinin en az bir örneğinin gerekli olduğu konusunda uyarılmalıdır. Bu dosya, bu uyarıları uygulayan doğrulama kısıtlamaları sağlar. Ekleme üst öğesinin 1..1 bağlantısı doğrulanmaz.

Bu kısıtlamaların yürütülmesi için DSL Gezgini'ndeki Düzenleyici\Doğrulama düğümündeki Kullanımlar... seçeneklerinden birini ayarlamış olmanız gerekir. Daha fazla bilgi için bkz . Etki Alanına Özgü Dilde Doğrulama.

PropertiesGrid.cs

Bu dosya yalnızca bir etki alanı özelliğine Özel Tür Tanımlayıcısı eklediyseniz kod içerir. Daha fazla bilgi için bkz . Özellikler Penceresini Özelleştirme.

SerializationHelper.cs

  • Aynı takma ad tarafından iki öğeye başvurulmadığından emin olmak için bir doğrulama yöntemi. Daha fazla bilgi için bkz . Dosya Depolamayı ve XML Serileştirmeyi Özelleştirme.

  • Serileştirme sınıfları tarafından ortak kullanılan işlevleri sağlayan SerializationHelper sınıfı.

    Serializer.cs

    Her etki alanı sınıfı, ilişki, şekil, bağlayıcı, diyagram ve model için bir seri hale getirici sınıfı.

    Bu sınıfların özelliklerinin çoğu, XML Serileştirme Davranışı altındaki DSL Gezgini ayarları tarafından denetlenebilir.

    Shapes.cs

    DSL Tanımındaki her şekil sınıfı için bir sınıf. Şekiller' den NodeShapetüretilir. Daha fazla bilgi için bkz . Dosya Depolamayı ve XML Serileştirmeyi Özelleştirme.

    Oluşturulan yöntemleri kısmi bir sınıfta kendi yöntemlerinizle geçersiz kılmak için DSL Tanımında bağlayıcı için Çift Türetilmiş Oluşturur'ı ayarlayın. Bir oluşturucuyu kendi kodunuzla değiştirmek için Özel Oluşturucu Var'ı ayarlayın.

    Rengi ve diğer bazı stil özelliklerini çalışma zamanında değişken yapmak için DSL Tanımı diyagramında sınıfa sağ tıklayın ve Kullanıma Sunulan Ekle'nin üzerine gelin.

    Çalışma zamanında ek stil özellikleri değişkeni yapmak için bkz. ve TextFieldShapeElement

    ToolboxHelper.cs

    Öğe grubu prototiplerini öğe araçlarına yükleyerek araç kutusunu ayarlar. Bu prototiplerin kopyaları, kullanıcı aracı çalıştırdığında hedef öğelerle birleştirilir.

    Birkaç nesneden oluşan bir grup oluşturan bir araç kutusu öğesini tanımlamak için geçersiz kılabilirsiniz CreateElementPrototype() . Örneğin, alt bileşenleri olan nesneleri temsil eden bir öğe tanımlayabilirsiniz. Kodu değiştirdikten sonra araç kutusu önbelleğini temizlemek için Visual Studio'nun deneysel örneğini sıfırlayın.

DslPackage projesinde oluşturulan dosyalar

DslPackage, DSL modelini Visual Studio kabuğuna bağlayarak pencereyi, araç kutusunu ve menü komutlarını yönetir. Sınıfların çoğu çift türetilir, böylece yöntemlerinden herhangi birini geçersiz kılabilirsiniz.

CommandSet.cs

Diyagramda görünen sağ tıklama menü komutları. Bu kümeye uyarlayabilir veya ekleyebilirsiniz. Bu dosya komutların kodunu içerir. Menülerdeki komutların konumu Commands.vsct dosyası tarafından belirlenir. Daha fazla bilgi için bkz . Kullanıcı Komutları ve Eylemleri Yazma.

Constants.cs

Guıd.

DocData.cs

YourDslDocData, bir modelin dosyaya yüklenmesini ve kaydedilmesini yönetir ve Mağaza örneğini oluşturur.

Örneğin, DSL'nizi dosya yerine bir veritabanına kaydetmek istiyorsanız ve Save yöntemlerini geçersiz kılabilirsinizLoad.

DocView.cs

YourDsl, DocView diyagramın görüntülendiği pencereyi yönetir. Örneğin, diyagramı bir windows Formunun içine ekleyebilirsiniz:

DslPackage projesine bir Kullanıcı Denetimi dosyası ekleyin. Diyagramın görüntülenebileceği bir Panel ekleyin. Düğme ve diğer denetimleri ekleyin. Formun kod görünümünde, DSL'nize adları ayarlayarak aşağıdaki kodu ekleyin:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Shell;

namespace Company.EmbedInForm
{
  public partial class UserControl1 : UserControl
  {
    public UserControl1()
    {
      InitializeComponent();
    }

    private DiagramDocView docView;

    public UserControl1(DiagramDocView docView, Control content)
      : this()
    {
      this.docView = docView;
      panel1.Controls.Add(content);
    }

    private void button1_Click(object sender, EventArgs e)
    {
      ExampleModel modelRoot = this.docView.CurrentDiagram.ModelElement as ExampleModel;
      foreach (ExampleElement element in modelRoot.Elements)
      {
       listBox1.Items.Add(element.Name);
      }
    }
  }
  internal partial class EmbedInFormDocView
  {

    private ContainerControl container;

    /// <summary>
    /// Return a User Control instead of the DSL window.
    /// The user control will contain the DSL window.
    /// </summary>

    public override System.Windows.Forms.IWin32Window Window
    {
      get
      {
        if (container == null)
        {
          // Put the normal DSL Window inside our control
          container = new UserControl1(this, (Control)base.Window);
        }
        return container;
      }
    }
  }

}

EditorFactory.cs

Örnek ve DocData DocView. DSL paketiniz başlatıldığında Visual Studio'nın düzenleyiciyi açmak için kullandığı standart bir arabirimi yerine getiriyor. Package.cs özniteliğinde başvurulur ProvideEditorFactory

GeneratedVSCT.vsct

Diyagram sağ tıklama (bağlam) menüsü, Düzenle menüsü vb. gibi menülerdeki standart menü komutlarını bulur. Komutların kodu CommandSet.cs. Standart komutları yeniden yerleştirebilir veya değiştirebilir ve kendi komutlarınızı ekleyebilirsiniz. Daha fazla bilgi için bkz . Kullanıcı Komutları ve Eylemleri Yazma.

ModelExplorer.cs

DSL'niz için Model Gezgini'ni tanımlar. Bu, kullanıcının diyagramla birlikte gördüğü modelin ağaç görünümüdür.

Örneğin, öğelerin Model Gezgini'nde görünme sırasını değiştirmek için geçersiz kılabilirsiniz InsertTreeView() .

Model gezginindeki seçimin diyagram seçimiyle eşitlenmiş kalmasını istiyorsanız aşağıdaki kodu kullanabilirsiniz:

protected override void OnSelectionChanged(global::System.EventArgs e)
{
base.OnSelectionChanged(e);
// get the selected element
DslModeling::ModelElement selectedElement =
this.PrimarySelection as DslModeling::ModelElement;
// Select in the model explorer
SelectInModelExplorer<YOURLANGUAGEExplorerToolWindow>(selectedElement);
}
private void SelectInModelExplorer<T>(DslModeling::ModelElement modelElement)
where T : DslShell.ModelExplorerToolWindow
{
DslShell::ModelingPackage package =
this.GetService(typeof(VSShell.Package)) as DslShell::ModelingPackage;

if (package != null)
{
// find the model explorer window
T explorerWindow = package.GetToolWindow(typeof(T), true) as T;
if (explorerWindow != null)
{
// get the tree container
DslShell.ModelExplorerTreeContainer treeContainer =
explorerWindow.TreeContainer;
// find the tree node
DslShell.ExplorerTreeNode treeNode =
treeContainer.FindNodeForElement(modelElement);
// select the node
explorerWindow.TreeContainer.ObjectModelBrowser.SelectedNode = treeNode;
}
}
}

ModelExplorerToolWindow.cs

Model gezgininin görüntülendiği pencereyi tanımlar. Gezgindeki öğe seçimini işler.

Package.cs

Bu dosya DSL'nin Visual Studio ile nasıl tümleştir olduğunu tanımlar. Paket sınıfındaki öznitelikler DSL'yi dosya uzantınıza sahip dosyalar için işleyici olarak kaydeder, araç kutusunu tanımlar ve yeni bir pencerenin nasıl açılacağını tanımlar. Initialize() yöntemi, bir Visual Studio örneğine ilk DSL yüklendiğinde bir kez çağrılır.

Source.extension.vsixmanifest

Bu dosyayı özelleştirmek için dosyayı düzenleyin .tt .

Uyarı

.tt dosyasını simgeler veya resimler gibi kaynakları içerecek şekilde düzenlerseniz, kaynağın VSIX derlemesine dahil olduğundan emin olun. Çözüm Gezgini dosyasını seçin ve VSIX'e Ekle özelliğinin olduğundan Trueemin olun.

Bu dosya DSL'nin Bir Visual Studio Tümleştirme Uzantısına (VSIX) nasıl paketlenmiş olduğunu denetler. Daha fazla bilgi için bkz . Etki Alanına Özgü Dil Çözümlerini Dağıtma.