W szablonie tekstu przy użyciu programu Visual Studio ModelBus
Jeśli piszesz odczytać modelu, który zawiera szablony tekst Visual Studio odwołuje się do ModelBus, chcesz rozwiązać odniesienia do dostępu modelem docelowym.W takim przypadku należy dostosować szablony tekstu i odwołania języków specyficzne dla domeny (DSLs):
DSL, który jest przedmiotem odwołania muszą mieć karty ModelBus, który jest skonfigurowany dla dostępu z szablonów tekstu.Jeśli modem DSL jest również dostęp z innego kodu, zmodyfikowane karty jest wymagane, poza standardowe karty ModelBus.
Menedżer karty musi dziedziczyć po VsTextTemplatingModelingAdapterManager i musi mieć atrybut [HostSpecific(HostName)].
Szablon musi dziedziczyć po ModelBusEnabledTextTransformation.
[!UWAGA]
Jeśli chcesz przeczytać modeli DSL, które nie zawierają odwołań do ModelBus, można użyć dyrektywy procesory, które są generowane w projektach DSL.Aby uzyskać więcej informacji, zobacz Uzyskiwanie dostępu do modeli z szablonów tekstu.
Aby uzyskać więcej informacji na temat szablonów tekstu zobacz Generowanie kodu czasu projektowania przy użyciu szablonów tekst T4.
Tworzenie karty magistrali Model dostępu z szablonów tekstu
Aby rozwiązać odniesienia ModelBus w szablonie tekstu, docelowe DSL musi mieć zgodna karta.Szablony tekst wykonanie w oddzielnego parametru AppDomain, z Visual Studio dokument edytory i dlatego karta ma załadować modelu zamiast dostępu do niego przez DTE.
Aby utworzyć karty ModelBus, która jest zgodna z szablonów tekstu
Jeśli docelowe DSL roztwór nie jest ModelBusAdapter projektu, utwórz go za pomocą Kreatora rozszerzenia Modelbus:
Pobierz i zainstaluj Visual Studio ModelBus rozszerzenie, jeśli użytkownik jeszcze nie zostało to zrobione.Aby uzyskać więcej informacji, zobacz wizualizacji i modelowania SDK.
Otwórz plik definicji DSL.Kliknij prawym przyciskiem myszy na powierzchnię projektu, a następnie kliknij przycisk Włączyć Modelbus.
W oknie dialogowym wybierz I chcesz udostępnić ten DSL do ModelBus.Obie opcje można wybrać, jeśli chcesz, aby ten DSL, aby udostępnić jego modeli i zużyje odwołania do innych DSLs.
Click OK.Nowy projekt "ModelBusAdapter" dodaje się do roztworu DSL.
Kliknij przycisk Transform wszystkie szablony.
Odbuduj roztworu.
Jeśli chcesz uzyskać dostęp DSL, zarówno z szablonu tekst, jak i z innego kodu, takich jak polecenie Powiel ModelBusAdapter projektu:
W Eksploratorze Windows skopiuj i Wklej folder, który zawiera ModelBusAdapter.csproj.
Zmień nazwę pliku projektu (na przykład, aby T4ModelBusAdapter.csproj).
W Solution Explorer, kliknij prawym przyciskiem myszy węzeł roztwór, wskaż polecenie Dodaj, a następnie kliknij przycisk Istniejącego projektu.Zlokalizuj nowy projekt karty T4ModelBusAdapter.csproj.
W każdym *.tt pliku nowego projektu, należy zmienić obszar nazw.
Kliknij prawym przyciskiem myszy nowy projekt w oknie Solution Explorer, a następnie kliknij przycisk Właściwości.W edytorze właściwości zmienić nazwy zestawu wygenerowanego i domyślny obszar nazw.
W projekcie DslPackage Dodaj odwołanie do projektu nowej karty, tak aby zawierał odniesienia do obu kart.
W DslPackage\source.extension.tt należy dodać wiersz, który odwołuje się do nowego projektu karty.
<MefComponent>|T4ModelBusAdapter|</MefComponent>
Wszystkie szablony Transform i przebudować roztworu.Brak błędów kompilacji powinny występować.
W nowym projekcie karty należy dodać odwołania do następujących zestawów:
Microsoft.VisualStudio.TextTemplating.11.0
Microsoft.VisualStudio.TextTemplating.Modeling.11.0
W AdapterManager.tt:
Dziedziczy on zmienić deklaracji AdapterManagerBase VsTextTemplatingModelingAdapterManager.
public partial class <#= dslName =>AdapterManagerBase :
Microsoft.VisualStudio.TextTemplating.Modeling.VsTextTemplatingModelingAdapterManager { ...
W pobliżu końca pliku należy zastąpić atrybutu HostSpecific przed klasy AdapterManager.Usuń następujący wiersz:
[DslIntegration::HostSpecific(DslIntegrationShell::VsModelingAdapterManager.HostName)]
Wstaw następujący wiersz:
[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]
Ten atrybut filtruje zestaw kart jest dostępna, gdy konsument modelbus wyszukuje adaptera.
Wszystkie szablony Transform i przebudować roztworu.Brak błędów kompilacji powinny występować.
Zapisywanie szablonu tekst, który można rozpoznać odwołania ModelBus
Zazwyczaj można rozpocząć od szablonu, który czyta i generuje pliki z "źródło" DSL.Ten szablon używa dyrektywy, który jest generowany w projekcie źródłowym DSL do odczytu plików modelu źródła w sposób opisany w Uzyskiwanie dostępu do modeli z szablonów tekstu.Jednakże źródła DSL zawiera ModelBus odniesienia do "cel" DSL.Dlatego też chcesz włączyć kod szablonu rozwiązać odniesienia i uzyskiwać dostęp obiektu docelowego DSL.Dlatego należy dostosować szablon wykonaj następujące kroki:
Zmiana klasy podstawowej z szablonu do ModelBusEnabledTextTransformation.
Zawiera hostspecific="true" w dyrektywie szablonu.
Dodaj odwołania do zestawów do docelowych DSL i jego karty i aby umożliwić ModelBus.
Dyrektywa, która zostanie wygenerowana jako część docelowej DSL nie jest konieczne.
<#@ template debug="true" hostspecific="true" language="C#"
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 = "Company.TargetDsl.Dsl.dll" #>
<#@ assembly name = "Company.TargetDsl.T4ModelBusAdapter.dll" #>
<#@ assembly name = "System.Core" #>
<#@ import namespace="Microsoft.VisualStudio.Modeling.Integration" #>
<#@ import namespace="Company.TargetDsl" #>
<#@ import namespace="Company.TargetDsl.T4ModelBusAdapters" #>
<#@ import namespace="System.Linq" #>
<#
SourceModelRoot source = this.ModelRoot; // Usual access to source model.
// In the source DSL Definition, the root element has a model reference:
using (TargetAdapter adapter = this.ModelBus.CreateAdapter(source.ModelReference) as TargetAdapter)
{if (adapter != null)
{
// Get the root of the target model:
TargetRoot target = adapter.ModelRoot;
// The source DSL Definition has a class "SourceElement" embedded under the root.
// (Let’s assume they’re all in the same model file):
foreach (SourceElement sourceElement in source.Elements)
{
// In the source DSL Definition, each SourceElement has a MBR property:
ModelBusReference elementReference = sourceElement.ReferenceToTarget;
// Resolve the target model element:
TargetElement element = adapter.ResolveElementReference<TargetElement>(elementReference);
#>
The source <#= sourceElement.Name #> is linked to: <#= element.Name #> in target model: <#= target.Name #>.
<#
}
}}
// Other useful code: this.Host.ResolvePath(filename) gets an absolute filename
// from a path that is relative to the text template.
#>
Po wykonaniu tego szablonu tekst SourceDsl dyrektywy ładuje plik Sample.source.Szablon można uzyskać dostęp do elementów tego modelu, począwszy od this.ModelRoot.Kod można użyć klasy domeny i właściwości tego modemu DSL.
Ponadto szablonu można rozwiązać odniesienia ModelBus.W przypadku, gdy punkt odniesienia w do modelu docelowego, dyrektyw zestawu let kod klasy domeny i właściwości tego modelu DSL.
Jeśli nie używasz dyrektywy, która jest generowana przez projekt DSL, należy także uwzględnić następujące.
<#@ assembly name = "Microsoft.VisualStudio.Modeling.Sdk.11.0" #> <#@ assembly name = "Microsoft.VisualStudio.TextTemplating.Modeling.11.0" #>
Użyj this.ModelBus do uzyskania dostępu do ModelBus.
Instruktaż: Testowanie szablonu tekst, który korzysta z ModelBus
W tym instruktażu są wykonaj następujące kroki:
Konstruowanie dwóch DSLs.Jeden DSL, konsumentów, ma ModelBusReference właściwość, która może odnosić się do innych DSL, dostawcy.
Utwórz dwie karty ModelBus w dostawcy: jeden dla dostępu przez tekst szablony, drugą dla zwykłych kod.
Tworzenie instancji modele DSLs w pojedynczy projekt doświadczalnych.
Ustawianie właściwości domeny w jednym modelu, aby wskazywało inny model.
Zapis obsługi dwukrotnego kliknięcia, który otwiera model, który zostanie wskazany.
Zapisać szablon tekst, który można załadować pierwszego modelu, należy wykonać odwołanie do innego modelu i odczytać innego modelu.
Konstrukcja DSL, która jest dostępna dla ModelBus
Utwórz nowe rozwiązanie DSL.W tym przykładzie wybierz szablon zadania przepływu roztworu.Ustaw nazwę języka MBProvider i rozszerzenie nazwy pliku do ".provide".
W diagramie definicji DSL prawym przyciskiem myszy kliknij pustą część diagramu, który nie jest u góry, a następnie kliknij Włączyć Modelbus.
- Jeśli nie widzisz Włączyć Modelbus, muszą pobrać i zainstalować rozszerzenie VMSDK ModelBus.Go znaleźć w witrynie VMSDK: wizualizacji i modelowania SDK.
W Włączyć Modelbus okno dialogowe Wybierz narazić DSL, to do ModelBus, a następnie kliknij przycisk OK.
Nowy projekt, ModelBusAdapter, jest dodawana do roztworu.
Masz teraz DSL, do którego dostęp przez Szablony tekstu poprzez ModelBus.Odwołania do niego można rozwiązać w kodzie poleceń, programów obsługi zdarzeń lub zasad, które działają w AppDomain edytora plików modelu.Szablony tekst uruchamiane w oddzielnych AppDomain i nie można uzyskać dostępu modelu, gdy jest edytowany.Jeśli chcesz uzyskać dostęp ModelBus odwołania do tego DSL z szablonu tekstu, musi mieć oddzielne ModelBusAdapter.
Aby utworzyć karty ModelBus, która jest skonfigurowana dla szablonów tekstu
W Eksploratorze Windows skopiuj i Wklej folder, który zawiera ModelBusAdapter.csproj.
Nazwa folderu T4ModelBusAdapter.
Zmień nazwę pliku projektu T4ModelBusAdapter.csproj.
W oknie Solution Explorer należy dodać do roztworu MBProvider T4ModelBusAdapter.Kliknij prawym przyciskiem myszy węzeł roztwór, wskaż polecenie Dodaj, a następnie kliknij przycisk Istniejącego projektu.
Kliknij prawym przyciskiem myszy węzeł projektu T4ModelBusAdapter, a następnie kliknij przycisk Właściwości.W oknie właściwości projektu należy zmienić Nazwy zestawu i Domyślny obszar nazw do Company.MBProvider.T4ModelBusAdapters.
W każdym pliku *.tt w T4ModelBusAdapter wstawić "T4" Ostatnia część obszaru nazw, tak, aby wiersz podobny do następującego.
namespace <#= CodeGenerationUtilities.GetPackageNamespace(this.Dsl) #>.T4ModelBusAdapters
W DslPackage projektu, Dodaj odwołanie projektu do T4ModelBusAdapter.
W DslPackage\source.extension.tt, należy dodać następujący wiersz w obszarze <Content>.
<MefComponent>|T4ModelBusAdapter|</MefComponent>
W T4ModelBusAdapter projektu, Dodaj odwołanie do:Microsoft.VisualStudio.TextTemplating.Modeling.11.0
Otwórz T4ModelBusAdapter\AdapterManager.tt:
Zmiana klasy podstawowej z AdapterManagerBase do VsTextTemplatingModelingAdapterManager.Ta część pliku teraz podobny do następującego.
namespace <#= CodeGenerationUtilities.GetPackageNamespace(this.Dsl) #>.T4ModelBusAdapters { /// <summary> /// Adapter manager base class (double derived pattern) for the <#= dslName #> Designer /// </summary> public partial class <#= dslName #>AdapterManagerBase : Microsoft.VisualStudio.TextTemplating.Modeling.VsTextTemplatingModelingAdapterManager {
W pobliżu końca pliku Wstaw następujący atrybut dodatkowych na początku klasy AdapterManager.
[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]
Wynik podobny do następującego.
/// <summary> /// ModelBus modeling adapter manager for a <#= dslName #>Adapter model adapter /// </summary> [Mef::Export(typeof(DslIntegration::ModelBusAdapterManager))] [Mef::ExportMetadata(DslIntegration::CompositionAttributes.AdapterIdKey,<#= dslName #>Adapter.AdapterId)] [DslIntegration::HostSpecific(DslIntegrationShell::VsModelingAdapterManager.HostName)] [Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)] public partial class <#= dslName #>AdapterManager : <#= dslName #>AdapterManagerBase { }
Kliknij przycisk Transform wszystkie szablony w tytule pasek z Solution Explorer.
Odbuduj roztworu.Kliknij przycisk F5.
Sprawdź, czy działa DSL, naciskając klawisz F5.Otwórz projektów eksperymentalnych, Sample.provider.Zamknij doświadczalnych wystąpienie Visual Studio.
ModelBus odniesienia do tego DSL teraz można rozwiązać, w szablonach tekstu, a także w zwykłym kodu.
Konstrukcja DSL z właściwości domeny odniesienia ModelBus
Utworzyć nowe DSL za pomocą szablonu roztwór minimalne języka.Nazwę języka MBConsumer i ustawić rozszerzenie nazwy pliku do ".consume".
W programie project DSL Dodaj odwołanie do zestawu MBProvider DSL.Kliknij prawym przyciskiem myszy MBConsumer\Dsl\References , a następnie kliknij przycisk Dodaj odwołanie.W przeglądać tab, ZnajdźMBProvider\Dsl\bin\Debug\Company.MBProvider.Dsl.dll
Dzięki temu można utworzyć kod, który używa innych DSL.Jeśli chcesz utworzyć odwołania do kilku DSLs, dodać je także.
Na diagramie definicji DSL, kliknij diagram prawym przyciskiem myszy, a następnie kliknij przycisk Włączyć ModelBus.W oknie dialogowym wybierz włączyć ten DSL zużyje ModelBus.
W klasie ExampleElement, dodać nową właściwość domeny MBRi w oknie dialogowym właściwości, ustaw jej typ ModelBusReference.
Kliknij prawym przyciskiem myszy właściwości domeny na diagramie, a następnie kliknij przycisk ModelBusReference edytować określone właściwości.W oknie dialogowym wybierz elementu modelu.
Ustaw filtr okna dialogowego pliku do następującego.
Provider File|*.provide
Podciąg po "|" jest filtr dla okno dialogowe wyboru pliku.Można ustawić go do umożliwienia żadnych plików przy użyciu *. *
W typu elementu modelu listy, wprowadź nazwy jednego lub więcej domen klasy dostawcy DSL (na przykład Company.MBProvider.Task).Mogą to być klasy abstrakcyjne.Jeśli puste listy użytkownik może ustawić odwołanie do dowolnego elementu.
Zamknij to okno dialogowe i Transform wszystkie szablony.
Utworzono DSL, który może zawierać odwołania do elementów w innym DSL.
Utwórz odwołanie do innego pliku ModelBus w roztworze
W roztworze MBConsumer naciśnij klawisze CTRL + F5.Wystąpienie doświadczalnych Visual Studio otwiera się w MBConsumer\Debugging projektu.
Dodać kopię Sample.provide do MBConsumer\Debugging projektu.Jest to konieczne, ponieważ odwołanie ModelBus musi odwoływać się do pliku w tym samym roztworze.
Kliknij prawym przyciskiem myszy projekt debugowanie, wskaż polecenie Dodaj, a następnie kliknij przycisk Istniejącego elementu.
W Dodaj element okno dialogowe, ustawić filtr, wszystkie pliki (*. *).
Przejdź do MBProvider\Debugging\Sample.provide , a następnie kliknij przycisk Dodaj.
Open Sample.consume.
Kliknij przykład jednego z kształtów, a w oknie dialogowym właściwości kliknij [...] we właściwości MBR.W oknie dialogowym kliknij przycisk przeglądać i wybierz Sample.provide.W oknie elementy rozwiń węzeł typu zadania, a następnie wybierz jeden z elementów.
Zapisz plik.
(Jeszcze nie zamknąć doświadczalnych wystąpienie Visual Studio.)
Utworzono modelu, który zawiera odwołanie do elementu w innym modelem ModelBus.
Rozwiązać odniesienia ModelBus w szablonie tekstu
W wystąpieniu doświadczalnych Visual Studio, otwórz plik przykładowy tekst szablonu.Ustaw jego zawartości w następujący sposób.
<#@ template debug="true" hostspecific="true" language="C#" inherits="Microsoft.VisualStudio.TextTemplating.Modeling.ModelBusEnabledTextTransformation" #> <#@ MBConsumer processor="MBConsumerDirectiveProcessor" requires="fileName='Sample.consume'" #> <#@ output extension=".txt" #> <#@ assembly name = "Microsoft.VisualStudio.Modeling.Sdk.Integration.11.0" #> <#@ assembly name = "Company.MBProvider.Dsl.dll" #> <#@ import namespace="Microsoft.VisualStudio.Modeling.Integration" #> <#@ import namespace="Company.MBProvider" #> <# // Property provided by the Consumer directive processor: ExampleModel consumerModel = this.ExampleModel; // Iterate through Consumer model, listing the elements: foreach (ExampleElement element in consumerModel.Elements) { #> <#= element.Name #> <# if (element.MBR != null) using (ModelBusAdapter adapter = this.ModelBus.CreateAdapter(element.MBR)) { // If we allowed multiple types or DSLs in the MBR, discover type here. Task task = adapter.ResolveElementReference<Task>(element.MBR); #> <#= element.Name #> is linked to Task: <#= task==null ? "(null)" : task.Name #> <# } } #>
Należy zauważyć, następujące punkty:
hostSpecific i inherits atrybuty template dyrektywy musi być ustawiona.
Model konsumenta jest dostępny w zwykły sposób, poprzez dyrektywy procesora, który został wygenerowany w tym DSL.
Dyrektyw Zgromadzenia i przywozu musi być dostęp do ModelBus i typy dostawca modemu DSL.
Jeśli wiadomo, że wiele MBRs są związane z tym samym modelu, lepiej jest wywołanie CreateAdapter tylko jeden raz.
Zapisz szablon.Zweryfikuj, że plik wynikowy tekst podobny do następującego.
ExampleElement1 ExampleElement2 ExampleElement2 is linked to Task: Task2
Rozwiązać odniesienia ModelBus w obsłudze gest
Zamknij doświadczalnych wystąpienie Visual Studio, jeśli jest uruchomiona.
Dodawanie pliku o nazwie MBConsumer\Dsl\Custom.cs i ustawić jego zawartość do następujących.
namespace Company.MB2Consume { using Microsoft.VisualStudio.Modeling.Integration; using Company.MB3Provider; public partial class ExampleShape { public override void OnDoubleClick(Microsoft.VisualStudio.Modeling.Diagrams.DiagramPointEventArgs e) { base.OnDoubleClick(e); ExampleElement element = this.ModelElement as ExampleElement; if (element.MBR != null) { IModelBus modelbus = this.Store.GetService(typeof(SModelBus)) as IModelBus; using (ModelBusAdapter adapter = modelbus.CreateAdapter(element.MBR)) { Task task = adapter.ResolveElementReference<Task>(element.MBR); // Open a window on this model: ModelBusView view = adapter.GetDefaultView(); view.Show(); view.SetSelection(element.MBR); } } } } }
Naciśnij klawisze CTRL + F5.
W wystąpieniu doświadczalnych Visual Studio, otwórz Debugging\Sample.consume.
Kliknij dwukrotnie jeden kształt.
MBR ustawienie tego elementu otwiera model, do którego istnieje odwołanie, i jest zaznaczony element, do którego istnieje odwołanie.
Zobacz też
Koncepcje
Integrowanie modele przy użyciu programu Visual Studio Modelbus