Použití prvku Visual Studio ModelBus v textové šabloně
Pokud píšete text šablony, které číst modelu, který obsahuje Visual Studio ModelBus odkazy, můžete chtít vyřešit odkazy přístup k cílové modely.V takovém případě je třeba přizpůsobit text šablony a odkazované domény specifické jazyky (DSL, linky):
DSL, který je cílem odkazy musí mít ModelBus adaptéru, který je konfigurován pro přístup z textu šablony.Pokud také modem DSL z jiného kódu, je standardní adaptér ModelBus požadováno změněnou konfiguraci adaptéru.
Adaptér správce musí dědit z VsTextTemplatingModelingAdapterManager a musí mít atribut [HostSpecific(HostName)].
Šablona musí dědit z ModelBusEnabledTextTransformation.
[!POZNÁMKA]
Pokud si chcete přečíst DSL modely, které neobsahují odkazy ModelBus, můžete použít směrnice procesory, které jsou generovány v projektech DSL.Další informace naleznete v tématu Přístup k modelům z textových šablon.
Další informace o šablonách textu, viz Vytvoření kódu v době návrhu pomocí textových šablon T4.
Vytváření Model adaptéru sběrnice pro přístup z textu šablony
Chcete-li vyřešit ModelBus odkaz v šabloně text, musí mít cíl DSL kompatibilní adaptér.Text šablony spustit v samostatné domény AppDomain z Visual Studio dokumentu editory, a proto má adaptér načíst model, přístup pomocí zařízení DTE.
Vytvoření ModelBus adaptéru, který je kompatibilní s text šablony
Pokud cíl DSL řešení nemá ModelBusAdapter projektu, vytvořte pomocí Průvodce vytvořením Modelbus rozšíření:
Stáhnout a nainstalovat Visual Studio ModelBus rozšíření, pokud jste to již neučinili.Další informace naleznete v vizualizaci a modelování SDK.
Otevřete soubor definice DSL.Pravým tlačítkem myši na plochu návrhu a klepněte na tlačítko Povolení Modelbus.
V dialogovém okně vyberte chcete zpřístupnit tento DSL na ModelBus.Pokud chcete toto připojení DSL zpřístupnit své modely a využívat odkazy na ostatní DSL, linky, můžete vybrat obě možnosti.
Klikněte na tlačítko OK.Do řešení DSL je přidán nový projekt "ModelBusAdapter".
Klepněte na tlačítko transformace všechny šablony.
Znovu vytvořte řešení.
Pokud chcete získat přístup DSL z textu šablony i z jiných kódu, například příkaz Duplikovat ModelBusAdapter projektu:
V programu Průzkumník Windows zkopírujte a vložte složku, která obsahuje ModelBusAdapter.csproj.
Přejmenujte soubor projektu (například na T4ModelBusAdapter.csproj).
V Aplikaci Solution Explorer, klepněte pravým tlačítkem na uzel řešení, přejděte na Přidata klepněte na tlačítko Existujícího projektu.Vyhledejte nový projekt adaptér, T4ModelBusAdapter.csproj.
V každém *.tt soubor projektu nový obor názvů změnit.
Pravým tlačítkem myši na nový projekt v aplikaci Solution Explorer a klepněte na příkaz Vlastnosti.V editoru vlastností změňte názvy vygenerované sestavení a výchozí obor názvů.
V projektu DslPackage přidáte odkaz na nový projekt adaptér tak, aby odkazy na oba adaptéry.
V DslPackage\source.extension.tt přidejte řádek odkazující na nový projekt adaptéru.
<MefComponent>|T4ModelBusAdapter|</MefComponent>
Všechny šablony transformace a znovu vytvořit řešení.Žádné chyby sestavení by mělo dojít.
V novém projektu adaptéru přidáte odkazy na následující sestavení:
Microsoft.VisualStudio.TextTemplating.11.0
Microsoft.VisualStudio.TextTemplating.Modeling.11.0
V AdapterManager.tt:
Změna prohlášení AdapterManagerBase tak, aby se dědí z VsTextTemplatingModelingAdapterManager.
public partial class <#= dslName =>AdapterManagerBase :
Microsoft.VisualStudio.TextTemplating.Modeling.VsTextTemplatingModelingAdapterManager { ...
Poblíž konce 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 filtrů nastavení adaptérů, které je k dispozici při modelbus spotřebitele hledá adaptér.
Všechny šablony transformace a znovu vytvořit řešení.Žádné chyby sestavení by mělo dojít.
Psaní textu šablony, která lze vyřešit ModelBus odkazy
Obvykle začíná se šablonou, která čte a vytvoří soubory z "zdroj" DSL.Tato šablona používá směrnice, která je generována v projektu DSL zdroj čtení souborů zdrojového modelu způsobem, který je popsán v Přístup k modelům z textových šablon.Zdroj DSL však obsahuje ModelBus odkazy na "cíle" DSL.Proto chcete umožnit vyřešit odkazy a přístup k cílové DSL kódu šablony.Šablona musí proto přizpůsobit pomocí následujících kroků:
Změnit základní třída šablona ModelBusEnabledTextTransformation.
Zahrnout hostspecific="true" v šabloně směrnice.
Přidáte odkazy na sestavení cílového DSL a jeho adaptéru a povolit ModelBus.
Není nutné směrnice, která je generována jako čá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 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 spuštění této šablony text SourceDsl směrnice načte soubor Sample.source.Šablona přístup prvky modelu od this.ModelRoot.Kód můžete použít domény třídy a vlastnosti tohoto připojení DSL.
Navíc šablony můžete vyřešit ModelBus odkazy.Kde odkazy odkazují na cílový model, umožňují směrnic sestavení kódu pomocí domény třídy a vlastnosti DSL tento model.
Pokud nepoužíváte směrnice, která je generována podle projektu DSL, by měla zahrnovat také následující.
<#@ assembly name = "Microsoft.VisualStudio.Modeling.Sdk.11.0" #> <#@ assembly name = "Microsoft.VisualStudio.TextTemplating.Modeling.11.0" #>
Použití this.ModelBus získat přístup k ModelBus.
Názorný postup: Testování šablony Text, který používá ModelBus
V tomto návodu provedením následujících kroků:
Sestavit DSL, dvě linky.Jeden DSL spotřebitele, má ModelBusReference vlastnost, která může odkazovat DSL poskytovatele.
Vytvořit dva adaptéry ModelBus poskytovatele: jeden pro jiné běžné kódu přístup text šablony.
Vytvořte instanci modely DSL, linky v jednom experimentálního projektu.
Nastavte vlastnost domain v jednom modelu pro jiný model.
Zápis obsluhu poklepejte na otevřeném model, který je aktivní.
Zápis textu šablony lze načíst první model, použijte odkaz na jiný model a čtení jiný model.
Konstrukce DSL, který je přístupný pro ModelBus
Vytvořte nové řešení DSL.Například vyberte šablonu úloh tok řešení.Název jazyka MBProvider a příponu názvu souboru na ".provide".
V diagramu DSL Definition klepněte pravým tlačítkem myši na prázdnou část diagramu, který není uveden v horní a klepněte na tlačítko Povolení Modelbus.
- Pokud není Povolení Modelbus, je nutné stáhnout a nainstalovat rozšíření VMSDK ModelBus.Najít na webu VMSDK: vizualizaci a modelování SDK.
V Povolení Modelbus vyberte položku vystavit tento DSL na ModelBusa klepněte na tlačítko OK.
Nový projekt ModelBusAdapter, je přidán do roztoku.
Nyní máte DSL, který je přístupný text šablon prostřednictvím ModelBus.Odkazy na tento lze vyřešit v kódu příkazy, obslužné rutiny události nebo pravidla, které pracují v editoru soubor modelu domény AppDomain.Text šablony však spustit v samostatné domény AppDomain a model nelze přístup, pokud je upravována.Pokud chcete pro přístup k ModelBus odkazy na tento DSL text šablony, musí mít samostatné ModelBusAdapter.
Vytvoření ModelBus adaptéru, který je nakonfigurován pro Text šablony
V programu Průzkumník Windows zkopírujte a vložte složku, která obsahuje ModelBusAdapter.csproj.
Název složky T4ModelBusAdapter.
Přejmenujte soubor projektu T4ModelBusAdapter.csproj.
V aplikaci Solution Explorer přidáte T4ModelBusAdapter do MBProvider roztoku.Klepněte pravým tlačítkem na uzel řešení, přejděte na Přidata klepněte na tlačítko Existujícího projektu.
Klepněte pravým tlačítkem na uzel T4ModelBusAdapter projektu a klepněte na příkaz Vlastnosti.V okně Vlastnosti projektu změnit Název sestavení a Výchozí obor názvů na Company.MBProvider.T4ModelBusAdapters.
V každém souboru *.tt v T4ModelBusAdapter vložte "T4" poslední část oboru názvů, tak, aby se podobá následující řádek.
namespace <#= CodeGenerationUtilities.GetPackageNamespace(this.Dsl) #>.T4ModelBusAdapters
V DslPackage projektu, přidejte do projektu odkaz na T4ModelBusAdapter.
V DslPackage\source.extension.tt, přidejte následující řádek pod <Content>.
<MefComponent>|T4ModelBusAdapter|</MefComponent>
V T4ModelBusAdapter projektu, přidejte odkaz na:Microsoft.VisualStudio.TextTemplating.Modeling.11.0
Otevřete T4ModelBusAdapter\AdapterManager.tt:
Změnit základní třídy AdapterManagerBase na VsTextTemplatingModelingAdapterManager.Tato část souboru nyní následujícímu.
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 {
Poblíž konce souboru vložte následující další atribut z třídy AdapterManager.
[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]
Výsledek je podobný 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 { }
Klepněte na tlačítko Transformace všechny šablony v hlavě panel z roztoku Průzkumník.
Znovu vytvořte řešení.Klepněte na tlačítko F5.
Ověřte, zda je funkční modem DSL, stisknutím klávesy F5.V experimentální projekt otevřete Sample.provider.Ukončete experimentální instanci Visual Studio.
ModelBus odkazy na tento DSL nyní vyřešen, text šablon a také v běžném kódu.
Konstrukce DSL s vlastností ModelBus referenční doménu
Vytvořte nové připojení DSL pomocí šablony řešení minimální jazyk.Název jazyka MBConsumer a nastavit příponu souboru na ".consume".
V projektu DSL přidáte odkaz na sestavení MBProvider DSL.Pravým tlačítkem myši na MBConsumer\Dsl\References a klepněte na tlačítko Přidat odkaz na.V Procházet karta, vyhledejteMBProvider\Dsl\bin\Debug\Company.MBProvider.Dsl.dll
Můžete vytvořit kód, který používá jiné DSL.Pokud chcete vytvořit odkazy na několik DSL, linky, přidejte také.
V definici DSL diagramu klepněte pravým tlačítkem myši na diagram a klepněte na tlačítko Povolení ModelBus.V dialogovém okně vyberte Povolit tento DSL spotřebuje ModelBus.
Ve třídě ExampleElement, přidat nové vlastnosti domény MBRa v okně Vlastnosti nastavit typ jejího na ModelBusReference.
Vlastnost domain diagramu a klepněte na položku ModelBusReference upravit specifické vlastnosti.V dialogovém okně vyberte prvku modelu.
Nastavte filtr dialogové okno souboru následující.
Provider File|*.provide
Podřetězec po "|" je filtr pro dialogové okno pro výběr souboru.Můžete nastavit pomocí povolit všechny soubory *. *
V Typ prvku modelu seznam, zadejte názvy jedné nebo více domén třídy zprostředkovatele DSL (například Company.MBProvider.Task).Mohou být abstraktní třídy.Pokud necháte seznam, může uživatel nastavit odkaz na libovolný prvek.
Zavřete dialogové okno a Transformace všechny šablony.
Vytvořili jste DSL, který může obsahovat odkazy na prvky v jiném DSL.
Vytvořit odkaz na jiný soubor ModelBus v roztoku
V MBConsumer roztoku stiskněte CTRL + F5.Experimentální instance Visual Studio otevře MBConsumer\Debugging projektu.
Přidat kopii na Sample.provide MBConsumer\Debugging projektu.To je nezbytné, protože odkaz ModelBus musí odkazovat na soubor ve stejném roztoku.
Pravým tlačítkem myši na projekt ladění, přejděte na Přidata klepněte na tlačítko Existující položku.
V Přidat položku dialogovém okně nastavit filtr na všechny soubory (*. *).
Přejít na MBProvider\Debugging\Sample.provide a klepněte na tlačítko Přidat.
Otevřete Sample.consume.
Jeden příklad tvaru a v okně Vlastnosti na tlačítko [...] ve vlastnosti typu MBR.V dialogovém okně klepněte na tlačítko procházení a vyberte Sample.provide.V okně prvky rozbalte typ úkolu a vyberte jeden z prvků.
Uložte soubor.
(Ještě zavřít experimentální instance Visual Studio.)
Vytvoření modelu, který obsahuje odkaz na prvek jiný model ModelBus.
Vyřešit ModelBus odkaz v šabloně text
Experimentální instance Visual Studio, otevřete soubor šablony ukázkový text.Takto nastavte jeho obsahu.
<#@ 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 #> <# } } #>
Všimněte si následující body:
hostSpecific a inherits atributy template směrnice musí být nastavena.
Model spotřebitele je přistupováno prostřednictvím směrnice procesor, který byl vytvořen v tomto DSL obvyklým způsobem.
Sestavení a import směrnic musí mít přístup typy zprostředkovatele služeb DSL a ModelBus.
Pokud víte, že mnoho MBRs propojeny se stejný model, je lepší volání CreateAdapter pouze jednou.
Uložte šablonu.Ověřte, že výsledný textový soubor následujícímu.
ExampleElement1 ExampleElement2 ExampleElement2 is linked to Task: Task2
Vyřešit ModelBus odkaz v obsluze gesto
Zavřete experimentální instance Visual Studio, pokud je spuštěn.
Přidáte soubor s názvem MBConsumer\Dsl\Custom.cs a jeho obsahu nastavena 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.
Experimentální instance Visual Studio, Otevřít Debugging\Sample.consume.
Poklepejte na jeden obrazec.
Pokud nastavíte MBR na tento prvek, otevře odkazovaný modelu a je vybrán odkazovaný element.