Použití prvku Visual Studio ModelBus v textové šabloně
Pokud napíšete textové šablony, které čtou model, který obsahuje odkazy Visual Studio ModelBus, můžete odkazy vyřešit pro přístup k cílovým modelům. V takovém případě musíte přizpůsobit textové šablony a odkazované jazyky specifické pro doménu (DSL):
DSL, který je cílem odkazů, musí mít adaptér ModelBus, který je nakonfigurovaný pro přístup z textových šablon. Pokud také přistupujete k DSL z jiného kódu, vyžaduje se kromě standardního adaptéru ModelBus adaptér i překonfigurovaný adaptér.
Správce adaptéru musí dědit z VsTextTemplatingModelingAdapterManager a musí mít atribut
[HostSpecific(HostName)]
.Šablona musí dědit z ModelBusEnabledTextTransformation.
Poznámka:
Pokud chcete číst modely DSL, které neobsahují odkazy ModelBus, můžete použít procesory direktiv, které jsou generovány v projektech DSL. Další informace najdete v tématu Přístup k modelům z textových šablon.
Další informace o textových šablonách naleznete v tématu Generování kódu v době návrhu pomocí textových šablon T4.
Vytvoření adaptéru sběrnice modelu pro přístup z textových šablon
Pokud chcete přeložit odkaz ModelBus v textové šabloně, musí mít cílový DSL kompatibilní adaptér. Textové šablony se spouštějí v samostatné doméně AppDomain od editorů dokumentů sady Visual Studio, a proto adaptér musí načíst model místo přístupu přes DTE.
Pokud cílové řešení DSL nemá projekt ModelBusAdapter , vytvořte ho pomocí průvodce rozšířením Modelbus:
Pokud jste to ještě neudělali, stáhněte a nainstalujte rozšíření Visual Studio ModelBus. Další informace naleznete v tématu Vizualizace a modelování SDK.
Otevřete definiční soubor DSL. Klepněte pravým tlačítkem myši na návrhovou plochu a potom klepněte na tlačítko Povolit Modelbus.
V dialogovém okně vyberte chci zveřejnit tuto DSL modelBus. Obě možnosti můžete vybrat, pokud chcete, aby tento DSL zpřístupnil své modely a aby spotřebovávat odkazy na jiné seznamy DSLS.
Klikněte na OK. Do řešení DSL se přidá nový projekt ModelBusAdapter.
Klikněte na Transformovat všechny šablony.
Znovu sestavte řešení.
Pokud chcete získat přístup k DSL z textové šablony i z jiného kódu, jako je například příkaz, duplikujte projekt ModelBusAdapter :
V Průzkumníku Windows zkopírujte a vložte složku obsahující ModelBusAdapter.csproj.
Přejmenujte soubor projektu (například na T4ModelBusAdapter.csproj).
V Průzkumník řešení klikněte pravým tlačítkem myši na uzel řešení, přejděte na příkaz Přidat a potom klikněte na existující projekt. Vyhledejte nový projekt adaptéru T4ModelBusAdapter.csproj.
V každém
*.tt
souboru nového projektu změňte obor názvů.Klepněte pravým tlačítkem myši na nový projekt v Průzkumník řešení a potom klepněte na příkaz Vlastnosti. V editoru vlastností změňte názvy vygenerovaného sestavení a výchozí obor názvů.
V projektu DslPackage přidejte odkaz na nový projekt adaptéru, aby byl odkaz na oba adaptéry.
V DslPackage\source.extension.tt přidejte řádek, který odkazuje na nový projekt adaptéru.
<MefComponent>|T4ModelBusAdapter|</MefComponent>
Transformujte všechny šablony a znovu sestavte řešení. Nemělo by docházet k žádným chybám sestavení.
V novém projektu adaptéru přidejte odkazy na následující sestavení:
- Microsoft.VisualStudio.TextTemplating.11.0
- Microsoft.VisualStudio.TextTemplating.Modeling.11.0
V AdapterManager.tt:
Změňte deklaraci AdapterManagerBase tak, aby dědila z VsTextTemplatingModelingAdapterManager.
public partial class <#= dslName =>AdapterManagerBase :
Microsoft.VisualStudio.TextTemplating.Modeling.VsTextTemplatingModelingAdapterManager { ...
Na konci souboru nahraďte atribut HostSpecific před AdapterManager třídy. Odeberte následující řádek:
[DslIntegration::HostSpecific(DslIntegrationShell::VsModelingAdapterManager.HostName)]
Vložte následující řádek:
[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]
Tento atribut filtruje sadu adaptérů, které jsou k dispozici, když uživatel modelubus vyhledá adaptér.
Transformujte všechny šablony a znovu sestavte řešení. Nemělo by docházet k žádným chybám sestavení.
Napsání textové šablony, která dokáže přeložit odkazy modeluBus
Obvykle začínáte šablonou, která čte a generuje soubory ze zdroje DSL. Tato šablona používá direktivu vygenerovanou ve zdrojovém projektu DSL ke čtení souborů zdrojového modelu způsobem, který je popsán v části Přístup k modelům z textových šablon. Zdrojový DSL však obsahuje odkazy modelbus na "cíl" DSL. Proto chcete povolit, aby kód šablony přeložil odkazy a přistupoval k cílové DSL. Šablonu proto musíte přizpůsobit následujícím postupem:
Změňte základní třídu šablony na ModelBusEnabledTextTransformation.
Zahrnout
hostspecific="true"
do direktivy šablony.Přidejte odkazy na sestavení do cílového DSL a jeho adaptéru a povolte ModelBus.
Nepotřebujete direktivu, která je generována jako součást cílové DSL.
<#@ 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 an 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.
#>
Při spuštění této textové šablony direktiva SourceDsl
načte soubor Sample.source
. Šablona má přístup k prvkům tohoto modelu počínaje .this.ModelRoot
Kód může používat třídy domény a vlastnosti této DSL.
Šablona navíc dokáže přeložit odkazy modelbusu. Pokud odkazy odkazují na cílový model, direktivy sestavení umožňují kódu používat třídy domény a vlastnosti DSL daného modelu.
Pokud nepoužíváte direktivu, která je generována projektem DSL, měli byste zahrnout také následující.
<#@ assembly name = "Microsoft.VisualStudio.Modeling.Sdk.11.0" #> <#@ assembly name = "Microsoft.VisualStudio.TextTemplating.Modeling.11.0" #>
Slouží
this.ModelBus
k získání přístupu k modelbusu.
Návod: Testování textové šablony, která používá modelBus
V tomto názorném postupu postupujte takto:
Vytvořte dvě seznamy DSLS. Jeden DSL, Příjemce, má
ModelBusReference
vlastnost, která může odkazovat na druhý DSL, poskytovatel.Ve zprostředkovateli vytvořte dva adaptéry ModelBus: jeden pro přístup pomocí textových šablon, druhý pro běžný kód.
Vytvořte modely instancí seznamů DSL v jednom experimentálním projektu.
Nastavte vlastnost domény v jednom modelu tak, aby odkazovat na druhý model.
Napište obslužnou rutinu poklikání, která otevře model, na který odkazuje.
Napište textovou šablonu, která může načíst první model, postupujte podle odkazu na druhý model a přečtěte si druhý model.
Vytvoření DSL, který je přístupný pro ModelBus
Vytvořte nové řešení DSL. V tomto příkladu vyberte šablonu řešení Tok úloh. Nastavte název jazyka na
MBProvider
a příponu názvu souboru na ".provide".V diagramu definice DSL klikněte pravým tlačítkem myši na prázdnou část diagramu, která není v horní části, a potom klepněte na tlačítko Povolit modelbus.
Pokud možnost Povolit modelbus nevidíte, stáhněte a nainstalujte rozšíření VMSDK ModelBus.
V dialogovém okně Povolit modelbus vyberte Zveřejnit tuto DSL modelBus a klepněte na tlačítko OK.
Do řešení se přidá nový projekt
ModelBusAdapter
.
Teď máte DSL, ke kterému mají přístup textové šablony prostřednictvím modelbusu. Odkazy na něj lze přeložit v kódu příkazů, obslužných rutin událostí nebo pravidel, z nichž všechny pracují v AppDomain editoru souborů modelu. Textové šablony se ale spouštějí v samostatné doméně AppDomain a při úpravách nemají přístup k modelu. Pokud chcete získat přístup k odkazům ModelBus na tento DSL z textové šablony, musíte mít samostatný ModelBusAdapter.
Vytvoření adaptéru ModelBus, který je nakonfigurovaný pro textové šablony
V Průzkumník souborů zkopírujte a vložte složku obsahující ModelBusAdapter.csproj.
Pojmenujte složku T4ModelBusAdapter.
Přejmenujte soubor projektu T4ModelBusAdapter.csproj.
V Průzkumník řešení přidejte T4ModelBusAdapter do řešení MBProvider. Klepněte pravým tlačítkem myši na uzel řešení, přejděte na příkaz Přidat a klepněte na příkaz Existující projekt.
Klikněte pravým tlačítkem myši na uzel projektu T4ModelBusAdapter a potom klepněte na příkaz Vlastnosti. V okně vlastností projektu změňte název sestavení a výchozí obor názvů na
Company.MBProvider.T4ModelBusAdapters
.V každém souboru *.tt v T4ModelBusAdapter vložte "T4" do poslední části oboru názvů, aby řádek vypadal následovně.
namespace <#= CodeGenerationUtilities.GetPackageNamespace(this.Dsl) #>.T4ModelBusAdapters
DslPackage
V projektu přidejte odkaz naT4ModelBusAdapter
projekt .Do dslPackage\source.extension.tt přidejte následující řádek pod
<Content>
.<MefComponent>|T4ModelBusAdapter|</MefComponent>
T4ModelBusAdapter
V projektu přidejte odkaz na: Microsoft.VisualStudio.TextTemplating.Modeling.11.0Otevřete T4ModelBusAdapter\AdapterManager.tt:
Změňte základní třídu AdapterManagerBase na VsTextTemplatingModelingAdapterManager. Tato část souboru teď vypadá podobně jako následující.
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 {
Na konec souboru vložte následující další atribut před třídu AdapterManager.
[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]
Výsledek vypadá podobně jako následující.
/// <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 { }
V záhlaví Průzkumník řešení klikněte na Transformovat všechny šablony.
Stiskněte klávesu F5.
Ověřte, že dsl funguje. V experimentálním projektu otevřete
Sample.provider
. Zavřete experimentální instanci sady Visual Studio.Odkazy modeluBus na tuto DSL lze nyní přeložit v textových šablonách a také v běžném kódu.
Vytvoření DSL s vlastností referenční domény ModelBus
Vytvořte novou DSL pomocí šablony řešení Minimal Language. Pojmenujte jazyk MBConsumer a nastavte příponu názvu souboru na ".consume".
V projektu DSL přidejte odkaz na sestavení MBProvider DSL. Klepněte pravým tlačítkem myši
MBConsumer\Dsl\References
a klepněte na příkaz Přidat odkaz. Na kartě Procházet vyhledejteMBProvider\Dsl\bin\Debug\Company.MBProvider.Dsl.dll
To vám umožní vytvořit kód, který používá druhý DSL. Pokud chcete vytvořit odkazy na několik seznamů DSL, přidejte je také.
V diagramu definice DSL klepněte pravým tlačítkem myši na diagram a potom klepněte na tlačítko Povolit ModelBus. V dialogovém okně vyberte Povolit tuto DSL, aby spotřebovávat ModelBus.
Ve třídě
ExampleElement
přidejte novou vlastnostMBR
domény a v okno Vlastnosti nastavte jeho typ naModelBusReference
.Klikněte pravým tlačítkem myši na vlastnost domény v diagramu a potom klepněte na příkaz Upravit vlastnosti specifické pro ModelBusReference. V dialogovém okně vyberte prvek modelu.
Nastavte filtr dialogového okna souboru na následující hodnoty.
Provider File|*.provide
Podřetěc za | je filtr pro dialogové okno pro výběr souboru. Můžete ho nastavit tak, aby povolovat všechny soubory pomocí *.*
V seznamu typ modelu zadejte názvy jedné nebo více tříd domény v zprostředkovatel DSL (například Company.MBProvider.Task). Mohou být abstraktní třídy. Pokud seznam necháte prázdný, uživatel může nastavit odkaz na libovolný prvek.
Zavřete dialogové okno a transformujte všechny šablony.
Vytvořili jste DSL, který může obsahovat odkazy na prvky v jiné DSL.
Vytvoření odkazu ModelBus na jiný soubor v řešení
V řešení MBConsumer stiskněte kombinaci kláves CTRL+F5. Experimentální instance sady Visual Studio se otevře v projektu MBConsumer\Debugging .
Přidejte kopii Sample.provide do projektu MBConsumer\Debugging . To je nezbytné, protože odkaz ModelBus musí odkazovat na soubor ve stejném řešení.
Klepněte pravým tlačítkem myši na projekt ladění, přejděte na příkaz Přidat a klepněte na tlačítko Existující položka.
V dialogovém okně Přidat položku nastavte filtr na Všechny soubory (*.*).
Přejděte na
MBProvider\Debugging\Sample.provide
příkaz Přidat a klikněte na tlačítko Přidat.
Otevře záznam typu
Sample.consume
.Klikněte na jeden příklad obrazce a v okno Vlastnosti klepněte na [...] ve vlastnosti MBR. V dialogovém okně klepněte na tlačítko Procházet a vyberte
Sample.provide
. V okně prvků rozbalte typ Úkol a vyberte jeden z prvků.Uložte soubor. (Zatím nezavírejte experimentální instanci sady Visual Studio.)
Vytvořili jste model, který obsahuje odkaz ModelBus na prvek v jiném modelu.
Řešení odkazu ModelBus v textové šabloně
V experimentální instanci sady Visual Studio otevřete ukázkový textový soubor šablony. Nastavte jeho obsah následujícím způsobem.
<#@ 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 #> <# } } #>
Mějte na paměti následující body:
Musí
hostSpecific
být nastaveny atributyinherits
direktivytemplate
.K modelu příjemce se přistupuje obvyklým způsobem prostřednictvím procesoru direktiv, který byl vygenerován v této DSL.
Direktivy sestavení a importu musí mít přístup k ModelBus a typům DSL zprostředkovatele.
Pokud víte, že mnoho MBR je propojeno se stejným modelem, je lepší volat CreateAdapter pouze jednou.
Uložte šablonu. Ověřte, že výsledný textový soubor vypadá přibližně takto.
ExampleElement1 ExampleElement2 ExampleElement2 is linked to Task: Task2
Řešení odkazu ModelBus v obslužné rutině gesta
Pokud je spuštěná, zavřete experimentální instanci sady Visual Studio.
Přidejte soubor s názvem MBConsumer\Dsl\Custom.cs a nastavte jeho obsah na následující:
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); } } } } }
Stiskněte Ctrl+F5.
V experimentální instanci sady Visual Studio otevřete
Debugging\Sample.consume
.Poklikejte na jeden obrazec.
Pokud jste pro tento prvek nastavili MBR, otevře se odkazovaný model a vybere se odkazovaný prvek.
Související obsah
Poznámka:
Komponenta Transformace textové šablony se automaticky nainstaluje jako součást sady funkcí vývoje rozšíření sady Visual Studio. Můžete ho také nainstalovat z karty Jednotlivé komponenty Instalační program pro Visual Studio v kategorii sad SDK, knihoven a architektur. Nainstalujte komponentu Modeling SDK z karty Jednotlivé komponenty .