Integrowanie modeli przy użyciu programu Visual Studio ModelBus

Program Visual Studio ModelBus udostępnia metodę tworzenia linków między modelami i z innych narzędzi do modeli. Można na przykład połączyć modele języka specyficznego dla domeny (DSL) i modele UML. Możesz utworzyć zintegrowany zestaw dsl.

Ostrzeżenie

Rozszerzenie ModelBus programu Visual Studio opisane w tym artykule nie jest już dostępne do pobrania. Jednak te instrukcje nadal działają dla tych użytkowników, którzy mają już zainstalowane to rozszerzenie.

ModelBus umożliwia utworzenie unikatowego odwołania do modelu lub określonego elementu w modelu. To odwołanie może być przechowywane poza modelem, na przykład w elemencie w innym modelu. Gdy później narzędzie chce uzyskać dostęp do elementu, infrastruktura ModelBus ładuje odpowiedni model i zwraca element. Jeśli chcesz, możesz wyświetlić model użytkownikowi. Jeśli nie można uzyskać dostępu do pliku w poprzedniej lokalizacji, modelBus prosi użytkownika o jego znalezienie. Jeśli użytkownik znajdzie plik, modelBus aktualizuje wszystkie odwołania do tego pliku.

Uwaga

W bieżącej implementacji modelu ModelBus programu Visual Studio połączone modele muszą być elementami w tym samym rozwiązaniu programu Visual Studio.

Aby uzyskać więcej informacji na temat rozszerzenia ModelBus, zobacz następujące zasoby:

Uwaga

Składnik Przekształcanie szablonu tekstu jest automatycznie instalowany w ramach obciążenia programistycznego rozszerzenia programu Visual Studio. Można go również zainstalować na karcie Poszczególne składniki Instalator programu Visual Studio w kategorii Zestawy SDK, biblioteki i struktury. Zainstaluj składnik Zestawu SDK modelowania na karcie Poszczególne składniki.

Zapewnianie dostępu do języka DSL

Przed utworzeniem odwołań ModeluBus do modelu lub jego elementów zdefiniuj modelBusAdapter dla rozszerzenia DSL. Najprostszym sposobem definiowania jest użycie rozszerzenia Visual Studio ModelBus, które dodaje polecenia do Projektant DSL.

Aby uwidocznić definicję DSL dla modelu ModelBus

  1. Otwórz plik definicji DSL. Kliknij prawym przyciskiem myszy powierzchnię projektową, a następnie wybierz pozycję Włącz modelBus.

  2. W oknie dialogowym wybierz pozycję Chcę uwidocznić ten język DSL dla modeluBus. Możesz wybrać obie opcje, jeśli chcesz, aby ten język DSL uwidocznił swoje modele i używać odwołań do innych list DSL.

  3. Wybierz przycisk OK. Nowy projekt ModelBusAdapter jest dodawany do rozwiązania DSL.

  4. Jeśli chcesz uzyskać dostęp do rozszerzenia DSL z szablonu tekstowego, musisz zmodyfikować AdapterManager.tt w nowym projekcie. Pomiń ten krok, jeśli chcesz uzyskać dostęp do rozszerzenia DSL z innego kodu, takiego jak polecenia i programy obsługi zdarzeń. Aby uzyskać więcej informacji, zobacz Using Visual Studio ModelBus in a Text Template (Używanie klasy ModelBus programu Visual Studio w szablonie tekstowym).

    1. Zmień klasę bazową na AdapterManagerBaseVsTextTemplatingModelingAdapterManager.

    2. W pobliżu końca pliku wstaw ten atrybut przed klasą AdapterManager:

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

    3. W Menedżer pakietów ModelBusAdapter NuGet projektu dodaj element NuGet PackageReference do elementu Microsoft.VisualStudio.TextTemplating.Modeling.

      Jeśli chcesz uzyskać dostęp do biblioteki DSL zarówno z szablonów tekstu, jak i z innego kodu, potrzebne są dwie karty, jedna zmodyfikowana i niezmodyfikowana.

  5. Wybierz pozycję Przekształć wszystkie szablony.

  6. Skompiluj ponownie rozwiązanie.

    ModelBus może teraz otwierać wystąpienia tego rozszerzenia DSL.

    Folder ModelBusAdapters\bin* zawiera zestawy utworzone przez Dsl projekt i ModelBusAdapters projekt. Aby odwołać się do tego rozszerzenia DSL z innego rozszerzenia DSL, zaimportuj te zestawy.

Upewnij się, że można odwoływać się do elementów

Domyślnie karty Visual Studio ModelBus używają identyfikatora GUID elementu do jego identyfikacji. Te identyfikatory muszą być utrwalane w pliku modelu.

Aby upewnić się, że identyfikatory elementów są utrwalane:

  1. Otwórz plik DslDefinition.dsl.

  2. W Eksploratorze DSL rozwiń węzeł Zachowanie serializacji XML, a następnie pozycję Dane klasy.

  3. Dla każdej klasy, do której chcesz utworzyć odwołania ModelBus:

    Wybierz węzeł klasy, a w oknie Właściwości upewnij się, że parametr Serialize ID ma ustawioną wartość true.

Alternatywnie, jeśli chcesz użyć nazw elementów do identyfikowania elementów zamiast identyfikatorów GUID, możesz zastąpić części wygenerowanych kart. Zastąpij następujące metody w klasie adaptera:

  • Zastąpić GetElementId , aby zwrócić identyfikator, którego chcesz użyć. Ta metoda jest wywoływana podczas tworzenia odwołań.
  • Zastąpij ResolveElementReference , aby zlokalizować prawidłowy element z odwołania ModelBus.

Uzyskiwanie dostępu do języka DSL z innej platformy DSL

Odwołania modeluBus można przechowywać we właściwości domeny w języku DSL i pisać kod niestandardowy, który z nich korzysta. Możesz również zezwolić użytkownikowi na utworzenie odwołania ModelBus, wybierając plik modelu i element w nim.

Aby umożliwić rozszerzenie DSL używanie odwołań do innego rozszerzenia DSL, należy najpierw uczynić go konsumentem odwołań do magistrali modelu.

Aby umożliwić rozszerzenie DSL do korzystania z odwołań do uwidocznionego rozszerzenia DSL

  1. Na diagramie definicji DSL kliknij prawym przyciskiem myszy główną część diagramu, a następnie wybierz pozycję Włącz modelBus.

  2. W oknie dialogowym wybierz pozycję Chcę włączyć ten model do korzystania z odwołań do magistrali modelu.

  3. W projekcie Dsl korzystającego z rozszerzenia DSL dodaj następujące zestawy do odwołań do projektu. Te zestawy (pliki dll ) znajdują się w katalogu ModelBusAdapter\bin\* uwidocznionego rozszerzenia DSL.

    • Uwidoczniony zestaw DSL, na przykład Fabrikam.FamilyTree.Dsl.dll

    • Zestaw adaptera magistrali modelu, na przykład Fabrikam.FamilyTree.ModelBusAdapter.dll

  4. Dodaj następujące zestawy platformy .NET do odwołań do projektu korzystającego z projektu DSL.

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

Aby zapisać modelBusReference we właściwości domeny

  1. W definicji DSL zużywających rozszerzenia DSL dodaj właściwość domeny do klasy domeny i ustaw jej nazwę.

  2. W oknie Właściwości z wybraną właściwością domeny ustaw wartość Typ na ModelBusReference.

    Na tym etapie kod programu może ustawić wartość właściwości. Wartość jest tylko do odczytu w oknie Właściwości .

    Możesz zezwolić użytkownikom na ustawianie właściwości za pomocą wyspecjalizowanego edytora ModelBusReference. Istnieją dwie wersje tego edytora lub selektora. Jeden umożliwia użytkownikom wybranie pliku modelu, a drugi umożliwia użytkownikom wybranie pliku modelu i elementu w modelu.

Aby umożliwić użytkownikowi ustawienie właściwości ModelBusReference we właściwości domeny

  1. Kliknij prawym przyciskiem myszy właściwość domeny, a następnie wybierz polecenie Edytuj właściwości specyficzne dla modeluBusReference. Zostanie otwarte okno dialogowe Selektor magistrali modelu.

  2. Ustaw odpowiedni rodzaj modeluBusReference na model lub element wewnątrz modelu.

  3. W ciągu filtru okna dialogowego pliku wprowadź ciąg, taki jak Family Tree files |*.ftree. Zastąp rozszerzenie pliku uwidocznionym rozszerzeniem DSL.

  4. Jeśli wybrano odwołanie do elementu w modelu, możesz dodać listę typów, które użytkownik może wybrać, na przykład Company.FamilyTree.Person.

  5. Wybierz przycisk OK, a następnie wybierz pozycję Przekształć wszystkie szablony na pasku narzędzi Eksplorator rozwiązań.

    Ostrzeżenie

    Jeśli nie wybrano prawidłowego modelu lub jednostki, przycisk OK nie ma żadnego wpływu, mimo że może być włączony.

  6. Jeśli określono listę typów docelowych, takich jak Company.FamilyTree.Person, należy dodać odwołanie do zestawu do projektu DSL, odwołując się do biblioteki DLL docelowego DSL, na przykład Company.FamilyTree.Dsl.dll.

Aby przetestować modelBusReference

  1. Skompiluj zarówno uwidocznione, jak i zużywające listy DSL.

  2. Uruchom jedną z list DSL w trybie eksperymentalnym, naciskając klawisz F5 lub CTRL+F5.

  3. W projekcie Debugowanie w eksperymentalnym wystąpieniu programu Visual Studio dodaj pliki, które są wystąpieniami poszczególnych dsl.

    Uwaga

    Program Visual Studio ModelBus może rozpoznawać odwołania tylko do modeli, które są elementami w tym samym rozwiązaniu programu Visual Studio. Na przykład nie można utworzyć odwołania do pliku modelu w innej części systemu plików.

  4. Utwórz niektóre elementy i linki w wystąpieniu uwidocznionego rozszerzenia DSL i zapisz je.

  5. Otwórz wystąpienie zużywające rozszerzenie DSL i wybierz element modelu, który ma właściwość referencyjną magistrali modelu.

  6. W oknie Właściwości kliknij dwukrotnie właściwość odwołania magistrali modelu. Zostanie otwarte okno dialogowe selektora.

  7. Wybierz pozycję Przeglądaj i wybierz wystąpienie uwidocznionego rozszerzenia DSL.

    Jeśli określono odwołanie do magistrali modelu specyficznego dla elementu, selektor umożliwia również wybranie elementu w modelu.

Tworzenie odwołań w kodzie programu

Jeśli chcesz przechowywać odwołanie do modelu lub elementu wewnątrz modelu, utwórz element ModelBusReference. Istnieją dwa rodzaje ModelBusReferenceodwołań do modelu i odwołania do elementów.

Aby utworzyć odwołanie do modelu, potrzebny jest adapterManager dsL, którego model jest wystąpieniem, oraz nazwa pliku lub element projektu programu Visual Studio modelu.

Aby utworzyć odwołanie do elementu, potrzebujesz karty dla pliku modelu i elementu, do którego chcesz się odwołać.

Uwaga

Za pomocą programu Visual Studio ModelBus można tworzyć odwołania tylko do elementów w tym samym rozwiązaniu programu Visual Studio.

Importowanie uwidocznionych zestawów DSL

W projekcie zużywających dodaj odwołania do projektu do platformy DSL i ModelBusAdapter zestawów uwidocznionych dsl.

Załóżmy na przykład, że chcesz przechowywać odwołania ModelBus w elementach biblioteki DSL MusicLibrary. Odwołania ModeluBus odnoszą się do elementów familyTree DSL. W węźle Odwołania w Dsl projekcie rozwiązania MusicLibrary dodaj odwołania do następujących zestawów:

  • Fabrikam.FamilyTree.Dsl.dll. Uwidoczniona platforma DSL.

  • Fabrikam.FamilyTree.ModelBusAdapters.dll Adapter ModelBus uwidocznionego rozszerzenia DSL.

  • Microsoft.VisualStudio.Modeling.Sdk.Integration

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

    Te zestawy można znaleźć w projekcie ModelBusAdapters uwidocznionego rozszerzenia DSL w obszarze *bin\**.

    W pliku kodu, w którym są tworzone odwołania, zazwyczaj trzeba zaimportować te przestrzenie nazw:

// 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;
...

Aby utworzyć odwołanie do modelu

Aby utworzyć odwołanie do modelu, uzyskujesz dostęp do elementu AdapterManager dla uwidocznionego rozszerzenia DSL i używasz go do utworzenia odwołania do modelu. Możesz określić ścieżkę pliku lub .EnvDTE.ProjectItem

Za pomocą adapterManager można uzyskać kartę, która zapewnia dostęp do poszczególnych elementów w modelu.

Uwaga

Po zakończeniu należy usunąć kartę. Najwygodniejszym sposobem osiągnięcia tego celu jest instrukcja using . Ilustruje to poniższy przykład.

// 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

Jeśli chcesz mieć możliwość późniejszego użycia modelReference , możesz zapisać go we właściwości domeny, która ma typ ModelBusReferencezewnętrzny :

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

Aby umożliwić użytkownikom edytowanie tej właściwości domeny, użyj parametru ModelReferenceEditor w atrybucie Editor . Aby uzyskać więcej informacji, zobacz Zezwalanie użytkownikowi na edytowanie odwołania.

Aby utworzyć odwołanie do elementu

Adapter utworzony dla modelu może służyć do tworzenia i rozwiązywania odwołań.

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

Jeśli chcesz mieć możliwość późniejszego użycia elementReference , możesz zapisać go we właściwości domeny, która ma typ ModelBusReferencezewnętrzny . Aby umożliwić użytkownikom edycję, użyj parametru ModelElementReferenceEditor w atrybucie Editor . Aby uzyskać więcej informacji, zobacz Zezwalanie użytkownikowi na edytowanie odwołania.

Rozpoznawanie odwołań

Jeśli masz ModelBusReference (MBR), możesz uzyskać model lub element modelu, do którego się odwołuje. Jeśli element jest przedstawiony na diagramie lub innym widoku, możesz otworzyć widok i wybrać element.

Adapter można utworzyć na podstawie MBR. Z karty można uzyskać katalog główny modelu. Można również rozwiązać problemy z mbrami odwołującymi się do określonych elementów w modelu.

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.

Aby rozwiązać problem z modelemBusReferences w szablonie tekstowym

Rozszerzenie DSL, do którego chcesz uzyskać dostęp, musi mieć kartę ModelBus skonfigurowaną do uzyskiwania dostępu przez szablony tekstu. Aby uzyskać więcej informacji, zobacz Zapewnianie dostępu do dsL.

Zazwyczaj uzyskujesz dostęp do docelowego rozszerzenia DSL przy użyciu odwołania do magistrali modelu (MBR) przechowywanego w źródłowym interfejsie DSL. W związku z tym szablon zawiera dyrektywę źródłowego rozszerzenia DSL oraz kod umożliwiający rozwiązanie mbr. Aby uzyskać więcej informacji na temat szablonów tekstu, zobacz Generowanie kodu z języka specyficznego dla domeny.

<#@ 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 a 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 #>]]
<#
  }
#>

Aby uzyskać więcej informacji i przewodnik, zobacz Using Visual Studio ModelBus in a Text Template (Korzystanie z modelu Visual Studio ModelBus w szablonie tekstowym)

Serializowanie modeluBusReference

Jeśli chcesz przechowywać ModelBusReference (MBR) w postaci ciągu, możesz go serializować:

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

MbR, który jest serializowany w ten sposób, jest niezależny od kontekstu. Jeśli używasz prostej karty magistrali modelu opartej na plikach, MBR zawiera bezwzględną ścieżkę pliku. Jeśli pliki modelu wystąpienia nigdy nie są przenoszone, ta serializacja jest wystarczająca. Jednak pliki modelu są zazwyczaj elementami w projekcie programu Visual Studio. Użytkownicy oczekują, że będą mogli przenieść cały projekt do różnych części systemu plików. Oczekuje się również, że projekt będzie w stanie utrzymać kontrolę nad źródłem i otworzyć go na różnych komputerach. W związku z tym nazwy ścieżek powinny być serializowane względem lokalizacji projektu zawierającego pliki.

Serializacja względem określonej ścieżki pliku

Element ModelBusReference zawiera ReferenceContextelement , który jest słownikiem, w którym można przechowywać informacje, takie jak ścieżka pliku, względem której powinna być serializowana.

Aby serializować względem ścieżki:

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

Aby pobrać odwołanie z ciągu:

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

Odwołania modeluBus utworzone przez inne karty

Poniższe informacje są przydatne, jeśli chcesz utworzyć własną kartę.

Element ModelBusReference (MBR) składa się z dwóch części: nagłówka MBR, który jest deserializowany przez magistralę modelu, oraz specyficzny dla adaptera obsługiwany przez określonego menedżera kart. Takie podejście umożliwia udostępnienie własnego formatu serializacji adaptera. Można na przykład odwołać się do bazy danych, a nie pliku, albo przechowywać dodatkowe informacje w dokumentacji adaptera. Własna karta może umieścić dodatkowe informacje w pliku ReferenceContext.

Podczas deserializacji MBR należy podać element ReferenceContext, który jest następnie przechowywany w obiekcie MBR. Podczas serializacji MBR przechowywany obiekt ReferenceContext jest używany przez adapter w celu wygenerowania ciągu. Zdeserializowany ciąg nie zawiera wszystkich informacji w dokumentacjiContext. Na przykład w prostej karcie opartej na plikach odwołanieContext zawiera ścieżkę pliku głównego. Ścieżka nie jest przechowywana w serializowanym ciągu MBR.

MbR jest deserializowany w dwóch etapach:

  • ModelBusReferencePropertySerializer to standardowy serializator, który zajmuje się nagłówkiem MBR. Używa standardowej torby właściwości DSL SerializationContext , która jest przechowywana w ReferenceContext obiekcie przy użyciu klucza ModelBusReferencePropertySerializer.ModelBusLoadContextKey. W szczególności element SerializationContext powinien zawierać wystąpienie ModelBusklasy .

  • Karta ModelBus zajmuje się częścią mbr specyficzną dla adaptera. Może używać dodatkowych informacji przechowywanych w dokumentacjikontekstu MBR. Prosta karta oparta na plikach przechowuje ścieżki plików głównych przy użyciu kluczy FilePathLoadContextKey i FilePathSaveContextKey.

    Odwołanie do karty w pliku modelu jest deserializowane tylko wtedy, gdy jest używane.

Utwórz model

Tworzenie, otwieranie i edytowanie modelu

Poniższy fragment jest pobierany z przykładu State Machine w witrynie internetowej zestawu VMSDK. Ilustruje ona użycie modelu ModelBusReferences do utworzenia i otwarcia modelu oraz uzyskania diagramu skojarzonego z modelem.

W tym przykładzie nazwa docelowego rozszerzenia DSL to StateMachine. Pochodzi z niego kilka nazw, takich jak nazwa klasy modelu i nazwa klasy 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();
    }
}

Weryfikowanie odwołań

BrokenReferenceDetector testuje wszystkie właściwości domeny w magazynie, który może przechowywać modelBusReferences. Wywołuje akcję, która określa miejsce znalezienia dowolnej akcji. Ten test jest przydatny w przypadku metod walidacji. Następująca metoda sprawdzania poprawności sprawdza magazyn podczas próby zapisania modelu i zgłasza uszkodzone odwołania w oknie błędów:

[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";

Akcje wykonywane przez rozszerzenie ModelBus

Poniższe informacje mogą być przydatne, jeśli korzystasz z modelu ModelBus.

Rozszerzenie ModelBus wprowadza następujące zmiany w rozwiązaniu DSL.

Po kliknięciu prawym przyciskiem myszy diagramu definicji DSL wybierz pozycję Włącz modelbus, a następnie wybierz pozycję Włącz tę bibliotekę DSL, aby korzystać z modeluBus:

  • W projekcie DSL należy dodać odwołanie do biblioteki Microsoft.VisualStudio.Modeling.Sdk.Integration.dll.

  • W definicji DSL dodano odwołanie typu zewnętrznego: Microsoft.VisualStudio.Modeling.Integration.ModelBusReference.

    Odwołanie można wyświetlić w Eksploratorze DSL w obszarze Typy domen. Aby ręcznie dodać odwołania do typów zewnętrznych, kliknij prawym przyciskiem myszy węzeł główny.

  • Zostanie dodany nowy plik szablonu Dsl\GeneratedCode\ModelBusReferencesSerialization.tt.

Po ustawieniu typu właściwości domeny na ModelBusReference, a następnie kliknij prawym przyciskiem myszy właściwość i wybierz pozycję Włącz właściwości właściwości ModelBusReference:

  • Do właściwości domeny jest dodawanych kilka atrybutów CLR. Można je wyświetlić w polu Atrybuty niestandardowe w oknie Właściwości . W pliku Dsl\GeneratedCode\DomainClasses.cs można zobaczyć atrybuty w deklaracji właściwości:

    [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")]
    

Po kliknięciu prawym przyciskiem myszy diagramu definicji DSL wybierz pozycję Włącz modelBus i wybierz polecenie Uwidocznij ten plik DSL w modeluBus:

  • Nowy projekt ModelBusAdapter jest dodawany do rozwiązania.

  • Odwołanie do ModelBusAdapter elementu zostanie dodane do DslPackage projektu. ModelBusAdapter zawiera odwołanie do Dsl projektu.

  • W pliku DslPackage\source.extention.tt|ModelBusAdapter| element jest dodawany jako składnik MEF.