Aracılığıyla paylaş


Araçları ve Araç Kutusunu Özelleştirme

Kullanıcıların modellerine eklemesine izin vermek istediğiniz öğeler için araç kutusu öğeleri tanımlamanız gerekir. İki tür araç vardır: öğe araçları ve bağlantı araçları. Oluşturulan tasarımcıda, kullanıcı şekilleri diyagrama sürüklemek için bir öğe aracı seçebilir ve şekiller arasında bağlantı çizmek için bir bağlantı aracı seçebilir. Genel olarak, öğe araçları kullanıcıların modellerine etki alanı sınıflarının örneklerini eklemesine ve bağlantı araçları da etki alanı ilişkilerinin örneklerini eklemelerine olanak tanır.

Araç kutusu nasıl tanımlanır?

DSL Gezgini'nde Düzenleyici düğümünü ve altındaki düğümleri genişletin. Genellikle şuna benzer bir hiyerarşi görürsünüz:

Editor
     Toolbox Tabs
        MyDsl          //a tab
           Tools
               ExampleElement      // an element tool
               ExampleRelationship // a connection tool

DSL Gezgini'nin bu bölümünde şunları yapabilirsiniz:

  • Yeni sekmeler oluşturun. Sekmeler, araç kutusundaki bölüm başlıklarını tanımlar.

  • Yeni araçlar oluşturun.

  • Kopyalama ve yapıştırma araçları.

  • Araçları listede yukarı veya aşağı taşıma.

  • Sekmeleri ve araçları silin.

Önemli

DSL Gezgini'ne öğe eklemek veya yapıştırmak için yeni düğümün büyükbabasına sağ tıklayın. Örneğin, araç eklemek için Araçlar düğümüne değil sekmeye sağ tıklayın. Sekme eklemek için Düzenleyici düğümüne sağ tıklayın.

Her aracın Araç Kutusu Simgesi özelliği bir 16x16 bit eşlem dosyasına başvurur. Bu dosyalar genellikle Dsl\Resources klasöründe tutulur.

Bir öğe aracının Class özelliği somut bir etki alanı sınıfına başvurur. Varsayılan olarak, araç bu sınıfın örneklerini oluşturur. Ancak, aracın öğe grupları veya farklı türlerdeki öğeler oluşturmasını sağlamak için kod yazabilirsiniz.

Bağlantı aracının Bağlan ion Builder özelliği, aracın bağlanabileceği öğe türlerini ve bunlar arasında hangi ilişkileri oluşturduğunu tanımlayan bir bağlantı oluşturucusunu ifade eder. Bağlan ion oluşturucuları DSL Gezgini'nde düğümler olarak tanımlanır. Bağlan ion oluşturucuları, etki alanı ilişkilerini tanımladığınızda otomatik olarak oluşturulur, ancak bunları özelleştirmek için kod yazabilirsiniz.

Araç kutusuna araç eklemek için

  1. Genellikle bir şekil sınıfı oluşturup bunu bir etki alanı sınıfıyla eşledikten sonra bir öğe aracı oluşturursunuz.

    Genellikle bir bağlayıcı sınıfı oluşturup bunu bir başvuru ilişkisine eşledikten sonra bir bağlayıcı aracı oluşturursunuz.

  2. DSL Gezgini'nde Düzenleyici düğümünü ve Araç Kutusu Sekmeleri düğümünü genişletin.

    Araç kutusu sekme düğümüne sağ tıklayın ve ardından Yeni Öğe Ekle Aracı'na veya Yeni Bağlan Ekleme Aracı'na tıklayın.

  3. 16x16 bit eşlemine başvurmak için Araç Kutusu Simgesi özelliğini ayarlayın.

    Yeni bir simge tanımlamak istiyorsanız Dsl\Resources klasöründeki Çözüm Gezgini bir bit eşlem dosyası oluşturun. Dosya şu özellik değerlerine sahip olmalıdır: Derleme Eylemi = İçeriği; Çıkış Dizinine = Kopyala Kopyala kopyalamayın.

  4. Öğe aracı için: Bir şekle eşlenen somut bir etki alanı sınıfına başvurmak için aracın Class özelliğini ayarlayın.

    Bağlayıcı aracı için: Aracın Bağlan ion Builder özelliğini açılan listede sunulan öğelerden birine ayarlayın. Bağlan ion oluşturucuları, bağlayıcıyı bir etki alanı ilişkisine eşlediğinizde otomatik olarak oluşturulur. Yakın zamanda bir bağlayıcı oluşturduysanız, normalde ilişkili bağlantı oluşturucuyu seçersiniz.

  5. DSL'yi test etmek için F5 veya CTRL+F5 tuşlarına basın ve Visual Studio'nun deneysel örneğinde örnek bir model dosyası açın. Yeni araç araç kutusunda görünmelidir. Yeni bir öğe oluşturduğunu doğrulamak için diyagrama sürükleyin.

    Araç görünmüyorsa deneysel Visual Studio'yu durdurun. Windows Başlat menüsünde Visual Studio'yu sıfırla yazın ve ardından Visual Studio sürümünüzle eşleşen Microsoft Visual Studio Deneysel Örneğini Sıfırla komutunu çalıştırın. Oluştur menüsünde Çözümü Yeniden Oluştur'a tıklayın. Ardından DSL'yi yeniden test edin.

Öğe Araçlarını Özelleştirme

Varsayılan olarak, araç belirtilen sınıfın tek bir örneğini oluşturur, ancak bunu iki şekilde değiştirebilirsiniz:

  • Diğer sınıflarda Öğe Birleştirme Yönergelerini tanımlayın, bu sınıfın yeni örneklerini kabul etmelerini ve yeni öğe oluşturulduğunda ek bağlantılar oluşturmalarını sağlayın. Örneğin, kullanıcının başka bir öğeye Açıklama bırakmasına izin verebilir ve böylece ikisi arasında bir başvuru bağlantısı oluşturabilirsiniz.

    Bu özelleştirmeler, kullanıcı bir öğeyi yapıştırdığında veya sürükleyip bıraktığında ne olacağını da etkiler.

    Daha fazla bilgi için bkz . Öğe Oluşturma ve Taşımayı Özelleştirme.

  • Öğe grupları oluşturabilmesi için aracı özelleştirmek için kod yazın. Araç, ToolboxHelper.cs dosyasında geçersiz kılabileceğiniz yöntemlerle başlatılır. Daha fazla bilgi için bkz . Araçtan Öğe Grupları Oluşturma.

Araçtan Öğe Grupları Oluşturma

Her öğe aracı, oluşturması gereken öğelerin bir prototipini içerir. Varsayılan olarak, her öğe aracı tek bir öğe oluşturur, ancak tek bir araçla bir grup ilgili nesne oluşturmak da mümkündür. Bunu yapmak için aracı ilgili öğeleri içeren bir ElementGroupPrototype ile başlatırsınız.

Aşağıdaki örnek, türü Transistör olan bir DSL'den alınmıştır. Her Transistörde Terminal adlı üç tane vardır. Transistörler için öğe aracı dört model öğesi ve üç ilişki bağlantısı içeren bir prototip depolar. Kullanıcı aracı diyagrama sürüklediğinde prototip örneği oluşturulur ve model köküne bağlanır.

Bu kod Dsl\GeneratedCode\ToolboxHelper.cs içinde tanımlanan bir yöntemi geçersiz kılar.

Program kodunu kullanarak modeli özelleştirme hakkında daha fazla bilgi için bkz . Program Kodunda ModelDe Gezinme ve Güncelleştirme.

using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;

  public partial class CircuitsToolboxHelper
  {
    /// <summary>
    /// Toolbox initialization, called for each element tool on the toolbox.
    /// This version deals with each Component subtype separately.
    /// </summary>
    /// <param name="store"></param>
    /// <param name="domainClassId">Identifies the domain class this tool should instantiate.</param>
    /// <returns>prototype of the object or group of objects to be created by tool</returns>
    protected override ElementGroupPrototype CreateElementToolPrototype(Store store, Guid domainClassId)
    {
        if (domainClassId == Transistor.DomainClassId)
        {
            Transistor transistor = new Transistor(store);

            transistor.Base = new ComponentTerminal(store);
            transistor.Collector = new ComponentTerminal(store);
            transistor.Emitter = new ComponentTerminal(store);

            transistor.Base.Name = "base";
            transistor.Collector.Name = "collector";
            transistor.Emitter.Name = "emitter";

            // Create an ElementGroup for the Toolbox.
            ElementGroup elementGroup = new ElementGroup(store.DefaultPartition);
            elementGroup.AddGraph(transistor, true);
            // AddGraph includes the embedded parts

            return elementGroup.CreatePrototype();
        }
        else
        {
            return base.CreateElementToolPrototype(store, domainClassId);
}  }    }

Bağlan Araçları'nı Özelleştirme

Genellikle, yeni bir bağlayıcı sınıfı oluşturduğunuzda bir öğe aracı oluşturursunuz. Alternatif olarak, iki ucun türlerinin ilişkinin türünü belirlemesine izin vererek bir aracı aşırı yükleyebilirsiniz. Örneğin, hem Kişi-Kişi ilişkileri hem de Kişi-Şehir ilişkileri oluşturabilecek bir bağlantı aracı tanımlayabilirsiniz.

Bağlan araçları bağlantı oluşturucularını çağırır. Kullanıcıların oluşturulan tasarımcıdaki öğeleri nasıl bağlayabileceğini belirtmek için bağlantı oluşturucularını kullanın. Bağlan ion oluşturucuları, bağlanabilecek öğeleri ve aralarında oluşturulan bağlantı türünü belirtir.

Etki alanı sınıfları arasında bir başvuru ilişkisi oluşturduğunuzda, otomatik olarak bir bağlantı oluşturucu oluşturulur. Bir bağlantı aracını eşlerken bu bağlantı oluşturucuyu kullanabilirsiniz. Bağlantı araçları oluşturma hakkında daha fazla bilgi için bkz . Araç Kutusunu Yapılandırma.

Varsayılan bağlantı oluşturucusunu değiştirerek farklı bir kaynak ve hedef tür aralığıyla başa çıkabilmesini ve farklı ilişki türleri oluşturmasını sağlayabilirsiniz.

Ayrıca bağlantı oluşturucuları için bağlantının kaynak ve hedef sınıflarını belirtmek, yapılacak bağlantı türünü tanımlamak ve bağlantı oluşturmayla ilişkili diğer eylemleri yapmak için özel kod yazabilirsiniz.

Bağlan ion Oluşturucularının Yapısı

Bağlan ion oluşturucuları, etki alanı ilişkisini ve kaynak ve hedef öğeleri belirten bir veya daha fazla bağlantı bağlantısı yönergesi içerir. Örneğin, Görev Akışı çözüm şablonunda, DSL Gezgini'nde CommentReferencesSubjectsBuilder'ı görebilirsiniz. Bu bağlantı oluşturucu, CommentReferencesSubjects adlı bir bağlantı bağlantı yönergesi içerir ve bu yönerge CommentReferencesSubjects etki alanı ilişkisine eşlenir. Bu bağlantı bağlantısı yönergesi, etki alanı sınıfını Comment işaret eden bir kaynak rol yönergesi ve etki alanı sınıfını işaret eden bir hedef rol yönergesi FlowElement içerir.

Kaynak ve Hedef Rolleri Kısıtlamak için Bağlan ion Oluşturucularını Kullanma

Belirli sınıfların kaynak rolde veya belirli bir etki alanı ilişkisinin hedef rolünde oluşumunu kısıtlamak için bağlantı oluşturucularını kullanabilirsiniz. Örneğin, başka bir etki alanı sınıfıyla etki alanı ilişkisi olan bir temel etki alanı sınıfınız olabilir, ancak temel sınıfın türetilmiş tüm sınıflarının bu ilişkide aynı rollere sahip olmasını istemeyebilirsiniz. Görev Akışı çözümünde, doğrudan soyut etki alanı sınıfından devralan dört somut etki alanı sınıfı (StartPoint, EndPoint, MergeBranch ve Eşitleme) ve dolaylı olarak ondan devralan iki somut etki alanı sınıfı (Task ve ObjectInState) vardır. FlowElement etki alanı sınıflarını hem kaynak rolünde hem de hedef rolünde alan bir Flow başvuru ilişkisi de vardır. Bununla birlikte, Bir EndPoint etki alanı sınıfının örneği Flow ilişkisinin bir örneğinin kaynağı olmamalıdır veya Bir StartPoint sınıfının örneği flow ilişkisinin bir örneğinin hedefi olmamalıdır. FlowBuilder bağlantı oluşturucusu, kaynak rolü (Görev, MergeBranch, StartPoint ve Eşitleme) hangi etki alanı sınıflarının oynayabileceğini ve hedef rolü (MergeBranch, Uç Nokta ve Eşitleme) oynayabileceğini belirten Flow adlı bir bağlantı bağlantı yönergesine sahiptir.

Bağlantı oluşturucuya birden fazla bağlantı bağlantısı yönergesi ekleyebilirsiniz. Bu, etki alanı modelinin bazı karmaşıklıklarını kullanıcılardan gizlemenize ve Araç Kutusu'nun çok karmaşık hale girmesini korumanıza yardımcı olabilir. Tek bir bağlantı oluşturucuya birkaç farklı etki alanı ilişkisi için bağlantı bağlantı yönergeleri ekleyebilirsiniz. Ancak, etki alanı ilişkilerini yaklaşık olarak aynı işlevi gerçekleştirdiklerinde birleştirmeniz gerekir.

Görev Akışı çözümünde Flow bağlantı aracı hem Flow hem de ObjectFlow etki alanı ilişkilerinin örneklerini çizmek için kullanılır. FlowBuilder bağlantı oluşturucusunda, daha önce açıklanan Flow bağlantısı bağlantı yönergesine ek olarak ObjectFlow adlı iki bağlantı bağlantısı yönergesi vardır. Bu yönergeler, objectFlow ilişkisinin bir örneğinin ObjectInState etki alanı sınıfı örnekleri arasında veya ObjectInState örneğinden bir Görevin örneğine çizilebileceğini, ancak görevin iki örneği arasında veya bir Görevin örneğinden ObjectInState örneğine çekilemediğini belirtir. Ancak, bir Görevin iki örneği arasında akış ilişkisinin bir örneği çizilebilir. Görev Akışı çözümünü derleyip çalıştırırsanız, Bir ObjectInState örneğinden Bir Görev örneğine Akış çizmenin bir ObjectFlow örneği oluşturduğunu, ancak bir Görevin iki örneği arasında Akış çizdiğinizde bir Akışın bir örneğini oluşturduğunu görebilirsiniz.

Bağlan ion Builder'lar için Özel Kod

Kullanıcı arabiriminde, bağlantı oluşturucularının farklı özelleştirme türlerini tanımlayan dört onay kutusu vardır:

  • Kaynak veya hedef rol yönergesinde Özel kabul et onay kutusu

  • Kaynak veya hedef rol yönergesinde Özel bağlantı onay kutusu

  • Bir connect yönergesinde Özel bağlantı kullanır onay kutusu

  • Bağlantı oluşturucusunun Özeldir özelliği

    Bu özelleştirmeleri yapmak için program kodu sağlamanız gerekir. Hangi kodu sağlamanız gerektiğini bulmak için bu kutulardan birini işaretleyin, Tüm Şablonları Dönüştür'e tıklayın ve çözümünüzü oluşturun. Hata raporu sonuçlanır. Hangi kodu eklemeniz gerektiğini açıklayan bir açıklama görmek için hata raporuna çift tıklayın.

Not

Özel kod eklemek için, bir kod dosyasında, GeneratedCode klasörlerindeki kod dosyalarından ayrı bir kısmi sınıf tanımı oluşturun. Çalışmanızı kaybetmemek için, oluşturulan kod dosyalarını düzenlememelisiniz. Daha fazla bilgi için bkz . Oluşturulan Sınıfları Geçersiz Kılma ve Genişletme.

Özel Bağlan ion kodu oluşturma

Her bağlantı bağlama yönergesinde , Kaynak rol yönergeleri sekmesi sürükleyebileceğiniz türlerden tanımlar. Benzer şekilde, Hedef rol yönergeleri sekmesi sürükleyebileceğiniz türleri tanımlar. Her tür için, Özel Kabul Et bayrağını ayarlayıp ek kodu sağlayarak bağlantıya izin verilip verilmeyeceğini (bu bağlantı bağlantısı yönergesi için) belirtebilirsiniz.

Ayrıca, bağlantı yapıldığında gerçekleşen işlemleri özelleştirebilirsiniz. Örneğin, sürüklemenin belirli bir sınıfa veya belirli bir sınıftan gerçekleşmesini, tek bir bağlantı bağlama yönergesinin idare ettiği tüm durumları veya FlowBuilder bağlantı oluşturucusunun tamamını özelleştirebilirsiniz. Bu seçeneklerin her biri için uygun düzeyde özel bayraklar ayarlayabilirsiniz. Tüm şablonları dönüştürüp çözümü oluşturmaya çalıştığınızda, hata iletileri sizi oluşturulan koddaki açıklamalara yönlendirir. Bu açıklamalar, sağlamanız gerekenleri tanımlar.

Bileşenler Diyagramı örneğinde, Bağlan ion etki alanı ilişkisinin bağlantı oluşturucusu, bağlantı noktaları arasında yapılabilecek bağlantıları kısıtlamak için özelleştirilir. Aşağıdaki çizimde, yalnızca öğelerden OutPort öğelere InPort bağlantı oluşturabileceğiniz, ancak bileşenleri iç içe yerleştirebileceğiniz gösterilmektedir.

Bağlan Ion İç İçe Yerleştirilmiş Bir Bileşenden OutPort'a Geliyor

Connection Builder

Bu nedenle, bir bağlantının iç içe bir bileşenden OutPort'a gelebileceğini belirtmek isteyebilirsiniz. Böyle bir bağlantı belirtmek için, Aşağıdaki çizimlerde gösterildiği gibi, InPort türünde kaynak rol olarak Özel Kabul Et'i ve DSL Ayrıntıları penceresinde Çıkış türü'nü hedef rol olarak ayarlarsınız:

DSL Gezgini'nde Bağlantı Bağlan Yönergesi

Connection builder image

DSL Ayrıntıları Penceresinde bağlantı Bağlan Yönergesi

Link connect directive in DSL Details window

Daha sonra Bağlan ionBuilder sınıfında yöntemler sağlamanız gerekir:

  public partial class ConnectionBuilder
  {
    /// <summary>
    /// OK if this component has children
    /// </summary>
    private static bool CanAcceptInPortAsSource(InPort candidate)
    {
       return candidate.Component.Children.Count > 0;
    }

    /// <summary>
    /// Only if source is on parent of target.
    /// </summary>
    private static bool CanAcceptInPortAndInPortAsSourceAndTarget                (InPort sourceInPort, InPort targetInPort)
    {
      return sourceInPort.Component == targetInPort.Component.Parent;
    }
// And similar for OutPorts...

Program kodunu kullanarak modeli özelleştirme hakkında daha fazla bilgi için bkz . Program Kodunda ModelDe Gezinme ve Güncelleştirme.

Örneğin, kullanıcıların üst-alt bağlantılarla döngü oluşturmasını önlemek için benzer kodu kullanabilirsiniz. Kullanıcılar herhangi bir zamanda ihlal edemeyeceği için bu kısıtlamalar 'zor' kısıtlamalar olarak kabul edilir. Ayrıca, kullanıcıların kaydedemedikleri geçersiz yapılandırmalar oluşturarak geçici olarak atlayabileceğiniz 'geçici' doğrulama denetimleri de oluşturabilirsiniz.

Bağlan ion Oluşturucularını Tanımlamada İyi Uygulama

Yalnızca kavramsal olarak ilişkili olan farklı ilişki türleri oluşturmak için bir bağlantı oluşturucu tanımlamanız gerekir. Görev akışı örneğinde, görevler arasında ve görevler ile nesneler arasında akışlar oluşturmak için aynı oluşturucuyu kullanırsınız. Ancak, açıklamalar ve görevler arasında ilişki oluşturmak için aynı oluşturucuyu kullanmak kafa karıştırıcı olabilir.

Birden çok ilişki türü için bir bağlantı oluşturucu tanımlarsanız, aynı kaynak ve hedef nesne çiftinden birden fazla tür eşleştiremeyeceğinden emin olmanız gerekir. Aksi takdirde, sonuçlar öngörülemez olur.

'Sabit' kısıtlamalar uygulamak için özel kod kullanırsınız, ancak kullanıcıların geçici olarak geçersiz bağlantılar kurup kuramayacağını göz önünde bulundurmalısınız. Gerekirse, kullanıcılar değişiklikleri kaydetmeye çalışana kadar bağlantıların doğrulanmaması için kısıtlamaları değiştirebilirsiniz.