Bagikan melalui


Mengintegrasikan model dengan menggunakan Visual Studio ModelBus

Visual Studio ModelBus menyediakan metode untuk membuat link antar model dan dari alat lainnya ke dalam model. Misalnya, Anda dapat menautkan model bahasa khusus domain (DSL) dan model UML. Anda dapat membuat sekumpulan DSL terintegrasi.

Peringatan

Ekstensi Visual Studio ModelBus, yang dijelaskan dalam artikel ini, tidak lagi tersedia untuk diunduh. Namun, instruksi ini masih berfungsi untuk pengguna yang sudah menginstal ekstensi ini.

ModelBus memungkinkan Anda membuat referensi unik ke model atau ke elemen tertentu di dalam model. Referensi ini dapat disimpan di luar model, misalnya, dalam elemen di dalam model lain. Ketika, pada kesempatan berikutnya, alat ingin mendapatkan akses ke elemen , infrastruktur ModelBus memuat model yang sesuai dan mengembalikan elemen . Jika mau, Anda dapat menampilkan model kepada pengguna. Jika file tidak dapat diakses di lokasi sebelumnya, ModelBus meminta pengguna untuk menemukannya. Jika pengguna menemukan file, ModelBus memperbarui semua referensi ke file tersebut.

Catatan

Dalam implementasi ModelBus Visual Studio saat ini, model yang ditautkan harus berupa item dalam solusi Visual Studio yang sama.

Untuk informasi selengkapnya tentang Ekstensi ModelBus, lihat sumber daya berikut ini:

Catatan

Komponen Transformasi Template Teks secara otomatis diinstal sebagai bagian dari beban kerja pengembangan ekstensi Visual Studio. Anda juga dapat menginstalnya dari tab Komponen individual Alat Penginstal Visual Studio, di bawah kategori SDK, pustaka, dan kerangka kerja. Instal komponen SDK Pemodelan dari tab Komponen individual.

Menyediakan akses ke DSL

Sebelum Anda dapat membuat referensi ModelBus ke model atau elemennya, tentukan ModelBusAdapter untuk DSL. Cara term mudah untuk menentukan salah satunya adalah dengan menggunakan Ekstensi Visual Studio ModelBus, yang menambahkan perintah ke DSL Designer.

Untuk mengekspos definisi DSL ke ModelBus

  1. Buka file Definisi DSL. Klik kanan permukaan desain lalu pilih Aktifkan ModelBus.

  2. Dalam dialog, pilih Saya ingin mengekspos DSL ini ke ModelBus. Anda dapat memilih kedua opsi jika Anda ingin DSL ini mengekspos modelnya dan menggunakan referensi ke DSL lain.

  3. Pilih OK. Proyek ModelBusAdapter baru ditambahkan ke solusi DSL.

  4. Jika Anda ingin mengakses DSL dari templat teks, Anda harus mengubah AdapterManager.tt di proyek baru. Hilangkan langkah ini jika Anda ingin mengakses DSL dari kode lain seperti perintah dan penanganan aktivitas. Untuk mendapatkan informasi selengkapnya, lihat Menggunakan Visual Studio ModelBus dalam Template Teks.

    1. Ubah kelas AdapterManagerBase dasar menjadi VsTextTemplatingModelingAdapterManager.

    2. Di dekat akhir file, sisipkan atribut ini di depan kelas AdapterManager:

      [Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]

    3. Di Manajer ModelBusAdapter Paket NuGet proyek, tambahkan NuGet PackageReference ke Microsoft.VisualStudio.TextTemplating.Modeling.

      Jika Anda ingin mengakses DSL baik dari templat teks maupun dari kode lain, Anda memerlukan dua adapter, satu dimodifikasi dan satu tidak dimodifikasi.

  5. Pilih Ubah Semua Templat.

  6. Bangun kembali solusinya.

    ModelBus sekarang dapat membuka instans DSL ini.

    Folder ModelBusAdapters\bin* berisi rakitan yang dibangun oleh Dsl proyek dan ModelBusAdapters proyek. Untuk mereferensikan DSL ini dari DSL lain, impor rakitan ini.

Pastikan bahwa elemen dapat direferensikan

Secara default, adaptor Visual Studio ModelBus menggunakan GUID elemen untuk mengidentifikasinya. Pengidentifikasi ini harus disimpan dalam file model.

Untuk memastikan bahwa ID elemen dipertahankan:

  1. Buka DslDefinition.dsl.

  2. Di Penjelajah DSL, perluas Perilaku Serialisasi Xml, lalu Data Kelas.

  3. Untuk setiap kelas yang ingin Anda buat referensi ModelBus:

    Pilih node kelas, dan di jendela Properti , pastikan bahwa ID Serialisasi diatur ke true.

Atau, jika Anda ingin menggunakan nama elemen untuk mengidentifikasi elemen alih-alih GUID, Anda dapat mengambil alih bagian adapter yang dihasilkan. Ambil alih metode berikut di kelas adapter:

  • Ambil alih GetElementId untuk mengembalikan pengidentifikasi yang ingin Anda gunakan. Metode ini dipanggil saat membuat referensi.
  • Ambil alih ResolveElementReference untuk menemukan elemen yang benar dari referensi ModelBus.

Mengakses DSL dari DSL lain

Anda dapat menyimpan referensi ModelBus di properti domain di DSL dan menulis kode kustom yang menggunakannya. Anda juga dapat membiarkan pengguna membuat referensi ModelBus dengan memilih file model dan elemen di dalamnya.

Untuk mengaktifkan DSL untuk menggunakan referensi ke DSL lain, Anda terlebih dahulu harus menjadikannya konsumen referensi bus model.

Untuk mengaktifkan DSL guna menggunakan referensi ke DSL yang terekspos

  1. Dalam diagram Definisi DSL, klik kanan bagian utama diagram lalu pilih Aktifkan ModelBus.

  2. Dalam dialog, pilih Saya ingin mengaktifkan model ini untuk menggunakan referensi bus model.

  3. Dsl Dalam proyek DSL yang mengkonsumsi, tambahkan rakitan berikut ke referensi proyek. Rakitan ini (file .dll ) berada di direktori ModelBusAdapter\bin\* dari DSL yang diekspos.

    • Assembly DSL yang diekspos, misalnya Fabrikam.FamilyTree.Dsl.dll

    • Assembly adapter bus model yang diekspos, misalnya Fabrikam.FamilyTree.ModelBusAdapter.dll

  4. Tambahkan assembly .NET berikut ke referensi proyek dari proyek DSL yang mengonsumsi.

    • Microsoft.VisualStudio.Modeling.Sdk.Integration.dll
    • Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell.dll

Untuk menyimpan ModelBusReference di properti domain

  1. Dalam Definisi DSL dari DSL yang mengonsumsi, tambahkan properti domain ke kelas domain dan atur namanya.

  2. Di jendela Properti , dengan properti domain dipilih, atur Jenis ke ModelBusReference.

    Pada tahap ini, kode program dapat mengatur nilai properti. Nilainya baca-saja di jendela Properti .

    Anda dapat mengizinkan pengguna untuk mengatur properti dengan editor ModelBusReference khusus. Ada dua versi editor atau pemilih ini. Satu memungkinkan pengguna untuk memilih file model dan yang lain memungkinkan pengguna untuk memilih file model dan elemen dalam model.

Untuk mengizinkan pengguna mengatur ModelBusReference di properti domain

  1. Klik kanan properti domain lalu pilih Edit ModelBusReferensi properti tertentu. Dialog Pemilih Bus Model terbuka.

  2. Atur Jenis ModelBusReference yang sesuai ke model atau ke elemen di dalam model.

  3. Dalam string filter dialog file, masukkan string seperti Family Tree files |*.ftree. Ganti ekstensi file DSL Anda yang diekspos.

  4. Jika Anda memilih untuk mereferensikan elemen dalam model, Anda dapat menambahkan daftar jenis yang dapat dipilih pengguna, misalnya Company.FamilyTree.Person.

  5. Pilih OK, lalu pilih Ubah Semua Templat di toolbar Penjelajah Solusi.

    Peringatan

    Jika Anda belum memilih model atau entitas yang valid, tombol OK tidak berpengaruh, meskipun mungkin muncul diaktifkan.

  6. Jika Anda menentukan daftar jenis target, seperti Company.FamilyTree.Person, maka Anda harus menambahkan referensi perakitan ke proyek DSL Anda, merujuk DLL DSL target, misalnya, Company.FamilyTree.Dsl.dll.

Untuk menguji ModelBusReference

  1. Bangun DLL yang diekspos sekaligus yang mengonsumsi.

  2. Jalankan salah satu DLL dalam mode eksperimental dengan menekan F5 atau CTRL+F5.

  3. Pada proyek Penelusuran Kesalahan dalam instans eksperimental Visual Studio, tambahkan file yang merupakan instans dari setiap DSL.

    Catatan

    Visual Studio ModelBus hanya dapat mengatasi referensi ke model yang merupakan item dalam solusi Visual Studio yang sama. Misalnya, Anda tidak dapat membuat referensi ke file model di bagian lain sistem file Anda.

  4. Buat beberapa elemen dan link dalam instans DSL yang diekspos, dan simpan.

  5. Buka instans DSL yang mengonsumsi, dan pilih elemen model yang memiliki properti referensi bus model.

  6. Di jendela Properti , klik dua kali properti referensi bus model. Dialog pemilih terbuka.

  7. Pilih Telusuri dan pilih instans DSL yang diekspos.

    Jika Anda menentukan referensi bus model khusus elemen, pemilih juga memungkinkan Anda memilih item dalam model.

Membuat referensi dalam kode program

Saat Anda ingin menyimpan referensi ke model atau elemen di dalam model, buat ModelBusReference. Terdapat dua jenis ModelBusReference: referensi model dan referensi elemen.

Untuk membuat referensi model, Anda memerlukan AdapterManager dari DSL yang modelnya adalah instans, dan nama file atau item proyek Visual Studio dari model.

Untuk membuat referensi elemen, Anda memerlukan adapter untuk file model, dan elemen yang ingin Anda rujuk.

Catatan

Dengan Visual Studio ModelBus, Anda hanya dapat membuat referensi ke item dalam solusi Visual Studio yang sama.

Mengimpor assembly DSL yang diekspos

Dalam proyek yang mengkonsumsi, tambahkan referensi proyek ke DSL dan ModelBusAdapter rakitan DSL yang terekspos.

Misalnya, Anda ingin menyimpan referensi ModelBus dalam elemen MusicLibrary DSL. Referensi ModelBus mengacu pada elemen FamilyTree DSL. Di simpul Referensi, dalam Dsl proyek solusi MusicLibrary, tambahkan referensi ke rakitan berikut:

  • Fabrikam.FamilyTree.Dsl.dll. DSL yang diekspos.

  • Fabrikam.FamilyTree.ModelBusAdapters.dll Adaptor ModelBus dari DSL yang diekspos.

  • Microsoft.VisualStudio.Modeling.Sdk.Integration

  • Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell

    Rakitan ini dapat ditemukan dalam ModelBusAdapters proyek DSL yang diekspos, di bawah *bin\**.

    Dalam file kode tempat Anda membuat referensi, Anda biasanya harus mengimpor namespace ini:

// The namespace of the DSL you want to reference:
using Fabrikam.FamilyTree;  // Exposed DSL
using Fabrikam.FamilyTree.ModelBusAdapters;
using Microsoft.VisualStudio.Modeling.Integration;
using System.Linq;
...

Untuk membuat referensi ke model

Untuk membuat referensi model, Anda mengakses AdapterManager untuk DSL yang diekspos, dan menggunakannya untuk membuat referensi ke model. Anda dapat menentukan jalur file, atau EnvDTE.ProjectItem.

Dari AdapterManager, Anda dapat memperoleh Adapter, yang menyediakan akses ke elemen individual dalam model tersebut.

Catatan

Anda harus membuang Adapter setelah selesai menggunakannya. Cara paling mudah untuk mencapainya adalah dengan pernyataan using. Contoh berikut mengilustrasikan langkah-langkah ini:

// The file path of a model instance of the FamilyTree DSL:
string targetModelFile = "TudorFamilyTree.ftree";
// Get the ModelBus service:
IModelBus modelBus =
    this.Store.GetService(typeof(SModelBus)) as IModelBus;
// Get an adapterManager for the target DSL:
FamilyTreeAdapterManager manager =
    (modelbus.GetAdapterManager(FamilyTreeAdapter.AdapterId)
     as FamilyTreeAdapterManager;
// or: (modelBus.FindAdapterManagers(targetModelFile).First())
// or could provide an EnvDTE.ProjectItem

// Create a reference to the target model:
// NOTE: the target model must be a file in this project.
ModelBusReference modelReference =
     manager.CreateReference(targetModelFile);
// or can use an EnvDTE.ProjectItem instead of the filename

// Get the root element of this model:
using (FamilyTreeAdapter adapter =
     modelBus.CreateAdapter(modelReference) as FamilyTreeAdapter)
{
  FamilyTree modelRoot = adapter.ModelRoot;
  // Access elements under the root in the usual way:
  foreach (Person p in modelRoot.Persons) {...}
  // You can create adapters for individual elements:
  ModelBusReference elementReference =
     adapter.GetElementReference(person);
  ...
} // Dispose adapter

Jika Anda ingin menggunakan modelReference nanti, Anda dapat menyimpannya di properti domain yang memiliki Jenis Eksternal ModelBusReference:

using Transaction t = this.Store.TransactionManager
    .BeginTransaction("keep reference"))
{
  artist.FamilyTreeReference = modelReference;
  t.Commit();
}

Untuk mengizinkan pengguna mengedit properti domain ini, gunakan ModelReferenceEditor sebagai parameter dalam Editor atribut . Untuk informasi selengkapnya, lihat Mengizinkan Pengguna Mengedit Referensi.

Untuk membuat referensi ke elemen

Adapter yang Anda buat untuk model dapat digunakan untuk membuat dan mengatasi referensi.

// person is an element in the FamilyTree model:
ModelBusReference personReference =
  adapter.GetElementReference(person);

Jika Anda ingin menggunakan elementReference nanti, Anda dapat menyimpannya di properti domain yang memiliki Jenis Eksternal ModelBusReference. Untuk mengizinkan pengguna mengeditnya, gunakan ModelElementReferenceEditor sebagai parameter dalam Editor atribut . Untuk informasi selengkapnya, lihat Mengizinkan Pengguna Mengedit Referensi.

Mengatasi referensi

Jika Anda memiliki ModelBusReference (MBR), Anda dapat memperoleh model atau elemen model yang dirujuknya. Jika elemen disajikan pada diagram atau tampilan lainnya, Anda dapat membuka tampilan dan memilih elemen.

Anda dapat membuat adapter dari MBR. Dari adapter, Anda dapat memperoleh akar model. Anda juga dapat mengatasi MBR yang merujuk ke elemen tertentu dalam model.

using Microsoft.VisualStudio.Modeling.Integration; ...
ModelBusReference elementReference = ...;

// Get the ModelBus service:
IModelBus modelBus =
    this.Store.GetService(typeof(SModelBus)) as IModelBus;
// Use a model reference or an element reference
// to obtain an adapter for the target model:
using (FamilyTreeAdapter adapter =
   modelBus.CreateAdapter(elementReference) as FamilyTreeAdapter)
   // or CreateAdapter(modelReference)
{
  // Get the root of the model:
  FamilyTree tree = adapter.ModelRoot;

  // Get a model element:
  MyDomainClass mel =
    adapter.ResolveElementReference<MyDomainClass>(elementReference);
  if (mel != null) {...}

  // Get the diagram or other view, if there is one:
  ModelBusView view = adapter.GetDefaultView();
  if (view != null)
  {
   view.Open();
   // Display the diagram:
   view.Show();
   // Attempt to select the shape that presents the element:
   view.SetSelection(elementReference);
  }
} // Dispose the adapter.

Untuk mengatasi ModelBusReferences dalam templat teks

DSL yang ingin Anda akses harus memiliki Adapter ModelBus yang telah dikonfigurasi untuk akses oleh templat teks. Untuk informasi selengkapnya, lihat Menyediakan Akses ke DSL.

Biasanya, Anda mengakses DSL target menggunakan Referensi Bus Model (MBR) yang disimpan di DSL sumber. Oleh karena itu, templat Anda menyertakan direktif DSL sumber, ditambah kode untuk mengatasi MBR. Untuk informasi selengkapnya mengenai templat teks, lihat Menghasilkan Kode dari Bahasa Khusus Domain.

<#@ template debug="true" hostspecific="true"
inherits="Microsoft.VisualStudio.TextTemplating.Modeling.ModelBusEnabledTextTransformation" #>
<#@ SourceDsl processor="SourceDslDirectiveProcessor" requires="fileName='Sample.source'" #>
<#@ output extension=".txt" #>
<#@ assembly name = "Microsoft.VisualStudio.Modeling.Sdk.Integration.11.0" #>
<#@ assembly name = "System.Core" #>
<#@ assembly name = "Company.CompartmentDragDrop.Dsl.dll" #>
<#@ assembly name = "Company.CompartmentDragDrop.ModelBusAdapter.dll" #>
<#@ import namespace="Microsoft.VisualStudio.Modeling.Integration" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="Company.CompartmentDragDrop" #>
<#@ import namespace="Company.CompartmentDragDrop.ModelBusAdapters" #>
<# // Get source root from directive processor:
  ExampleModel source = this.ExampleModel;
  // This DSL has an MBR in its root:
using (ModelBusAdapter adapter = this.ModelBus.CreateAdapter(source.ModelReference) as ModelBusAdapter)
  {
  ModelBusAdapterManager manager = this.ModelBus.FindAdapterManagers(this.Host.ResolvePath("Sample.compDD1")).FirstOrDefault();
  ModelBusReference modelReference =
    manager.CreateReference(this.Host.ResolvePath("Sample.compDD1"));

  // Get the root element of this model:
  using (CompartmentDragDropAdapter adapter =
     this.ModelBus.CreateAdapter(modelReference) as CompartmentDragDropAdapter)
  {
    ModelRoot root = adapter.ModelRoot;
#>
[[<#= root.Name #>]]
<#
  }
#>

Untuk informasi selengkapnya beserta panduan, lihat Menggunakan Visual Studio ModelBus dalam Templat Teks

Menserialisasi modelBusReference

Jika Anda ingin menyimpan ModelBusReference (MBR) dalam bentuk string, Anda dapat menserialisasikannya:

string serialized = modelBus.SerializeReference(elementReference);
// Store it anywhere, then get it back again:
ModelBusReference elementReferenceRestored =
    modelBus.DeserializeReference(serialized, null);

MBR yang diserialisasikan dengan cara ini independen dari konteks. Jika Anda menggunakan Adaptor Bus Model berbasis file sederhana, MBR berisi jalur file absolut. Jika file model instans tidak pernah dipindahkan, serialisasi ini sudah cukup. Namun, file model biasanya item dalam proyek Visual Studio. Pengguna Anda berharap dapat memindahkan seluruh proyek ke berbagai bagian sistem file. Mereka juga berharap dapat menjaga proyek di bawah kontrol sumber dan membukanya di komputer yang berbeda. Oleh karena itu, nama jalur harus diserialisasikan relatif terhadap lokasi proyek yang berisi file.

Serialisasi relatif terhadap jalur file tertentu

ModelBusReference berisi ReferenceContext, yang merupakan kamus tempat Anda dapat menyimpan informasi seperti jalur file relatif terhadap jalur file yang harus direalisasikan.

Untuk menserialisasikan relatif terhadap jalur:

elementReference.ReferenceContext.Add(
   ModelBusReferencePropertySerializer.FilePathSaveContextKey,
   currentProjectFilePath);
string serialized = modelBus.SerializeReference(elementReference);

Untuk mengambil referensi dari string:

ReferenceContext context = new ReferenceContext();
context.Add(ModelBusReferencePropertySerializer.FilePathLoadContextKey,
    currentProjectFilePath);
ModelBusReference elementReferenceRestored =
    modelBus.DeserializeReference(serialized, context);

Referensi ModelBus yang dibuat oleh adaptor lain

Informasi berikut berguna jika Anda ingin membuat adapter Anda sendiri.

ModelBusReference (MBR) terdiri dari dua bagian: header MBR, yang dideserialisasi oleh bus model, dan khusus adapter yang ditangani oleh manajer adapter tertentu. Pendekatan ini memungkinkan Anda menyediakan format serialisasi adaptor Anda sendiri. Misalnya, Anda dapat mereferensikan database alih-alih file, atau Anda dapat menyimpan informasi tambahan dalam referensi adapter. Adapter Anda sendiri dapat menempatkan informasi tambahan di dalam ReferenceContext.

Saat Anda mendeserialisasi MBR, Anda harus menyediakan ReferenceContext, yang kemudian disimpan di objek MBR. Saat Anda menserialisasikan MBR, ReferenceContext yang disimpan digunakan oleh adapter untuk membantu menghasilkan string. String yang dideserialisasi tidak berisi semua informasi dalam ReferenceContext. Misalnya, dalam adaptor berbasis file sederhana, ReferenceContext berisi jalur file akar. Jalur tidak disimpan dalam string MBR berseri.

MBR dideserialisasi dalam dua tahap:

  • ModelBusReferencePropertySerializer adalah serializer standar yang menangani header MBR. Serializer ini menggunakan tas properti SerializationContext DSL standar, yang disimpan di ReferenceContext menggunakan kunci ModelBusReferencePropertySerializer.ModelBusLoadContextKey. Secara khusus, SerializationContext harus berisi instans ModelBus.

  • Adapter ModelBus Anda menangani bagian khusus adapter dari MBR. Adapter ini dapat menggunakan informasi tambahan yang disimpan di ReferenceContext MBR. Adapter berbasis file sederhana menyimpan jalur file akar menggunakan kunci FilePathLoadContextKey dan FilePathSaveContextKey.

    Referensi adaptor dalam file model hanya dideserialisasi saat digunakan.

Buat model

Membuat, membuka, dan mengedit model

Fragmen berikut diambil dari sampel Mesin Status di situs web VMSDK. Fragmen ini menggambarkan penggunaan ModelBusReferences untuk membuat dan membuka model, dan untuk memperoleh diagram yang terkait dengan model tersebut.

Dalam sampel ini, nama DSL target adalah StateMachine. Beberapa nama berasal darinya, seperti nama kelas model dan nama ModelBusAdapter.

using Fabrikam.StateMachine.ModelBusAdapters;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Integration;
using Microsoft.VisualStudio.Modeling.Integration.Shell;
using Microsoft.VisualStudio.Modeling.Shell;
...
// Create a new model.
ModelBusReference modelReference =
   StateMachineAdapterManager    .CreateStateMachineModel(modelName, fileName);
//Keep reference of new model in this model.
using (Transaction t = ...)
{
  myModelElement.ReferenceProperty = modelReference;
  t.Commit();
}
// Get the ModelBus service from Visual Studio.
IModelBus modelBus = Microsoft.VisualStudio.Shell.Package.
    GetGlobalService(typeof(SModelBus)) as IModelBus;
// Get a modelbus adapter on the new model.
ModelBusAdapter modelBusAdapter;
modelBus.TryCreateAdapter(modelReference,
    this.ServiceProvider, out modelBusAdapter);
using (StateMachineAdapter adapter =
      modelBusAdapter as StateMachineAdapter)
{
    if (adapter != null)
    {
        // Obtain a Diagram from the adapter.
        Diagram targetDiagram =
           ((StandardVsModelingDiagramView)
                 adapter.GetDefaultView()
            ).Diagram;

        using (Transaction t =
             targetDiagram.Store.TransactionManager
                .BeginTransaction("Update diagram"))
        {
            DoUpdates(targetDiagram);
            t.Commit();
        }

        // Display the new diagram.
        adapter.GetDefaultView().Show();
    }
}

Memvalidasi referensi

BrokenReferenceDetector menguji semua properti domain di Store yang dapat menyimpan ModelBusReferences. Ini memanggil tindakan yang Anda berikan tempat tindakan apa pun ditemukan. Pengujian ini berguna untuk metode validasi. Metode validasi berikut menguji penyimpanan dalam upaya untuk menyimpan model, dan melaporkan referensi yang rusak di jendela kesalahan:

[ValidationMethod(ValidationCategories.Save)]
public void ValidateModelBusReferences(ValidationContext context)
{
  BrokenReferenceDetector.DetectBrokenReferences(this.Store,
    delegate(ModelElement element, // parent of property
             DomainPropertyInfo property, // identifies property
             ModelBusReference reference) // invalid reference
    {
      context.LogError(string.Format(INVALID_REF_FORMAT,
             property.Name,
             referenceState.Name,
             new ModelBusReferenceTypeConverter().
                 ConvertToInvariantString(reference)),
         "Reference",
         element);
    });
}
private const string INVALID_REF_FORMAT =
    "The '{0}' domain property of this ReferenceState instance "
  + "named '{1}' contains reference value '{2}' which is invalid";

Tindakan yang dilakukan oleh Ekstensi ModelBus

Informasi berikut mungkin berguna jika Anda menggunakan ModelBus secara ekstensif.

Ekstensi ModelBus membuat perubahan berikut dalam solusi DSL Anda.

Saat Anda mengklik kanan diagram Definisi DSL, pilih Aktifkan Modelbus, lalu pilih Aktifkan DSL ini untuk Menggunakan ModelBus:

  • Dalam proyek DSL, referensi harus ditambahkan ke Microsoft.VisualStudio.Modeling.Sdk.Integration.dll.

  • Dalam Definisi DSL, referensi Jenis Eksternal ditambahkan: Microsoft.VisualStudio.Modeling.Integration.ModelBusReference.

    Anda dapat melihat referensi tersebut di Penjelajah DSL, pada Jenis Domain. Untuk menambahkan referensi jenis eksternal secara manual, klik kanan node akar.

  • File templat baru ditambahkan, Dsl\GeneratedCode\ModelBusReferencesSerialization.tt.

Saat Anda mengatur jenis properti domain ke ModelBusReference, lalu klik kanan properti dan pilih Aktifkan properti khusus ModelBusReference:

  • Beberapa atribut CLR ditambahkan ke properti domain. Anda dapat melihatnya di bidang Atribut Kustom di jendela Properti . Dalam Dsl\GeneratedCode\DomainClasses.cs, Anda dapat melihat atribut pada deklarasi properti:

    [System.ComponentModel.TypeConverter(typeof(
    Microsoft.VisualStudio.Modeling.Integration.ModelBusReferenceTypeConverter))]
    [System.ComponentModel.Editor(typeof(
      Microsoft.VisualStudio.Modeling.Integration.Picker
      .ModelReferenceEditor // or ModelElementReferenceEditor
      ), typeof(System.Drawing.Design.UITypeEditor))]
    [Microsoft.VisualStudio.Modeling.Integration.Picker
      .SupplyFileBasedBrowserConfiguration
      ("Choose a model file", "Target model|*.target")]
    

Saat Anda mengklik kanan Diagram Definisi DSL, pilih Aktifkan ModelBus, dan pilih Ekspos DSL ini ke ModelBus:

  • Proyek ModelBusAdapter baru ditambahkan ke solusi.

  • Referensi ke ModelBusAdapter ditambahkan ke proyek DslPackage. ModelBusAdapter memiliki referensi ke proyek Dsl.

  • Dalam DslPackage\source.extention.tt, |ModelBusAdapter| ditambahkan sebagai komponen MEF.