Sdílet prostřednictvím


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.

  1. Pokud cílové řešení DSL nemá projekt ModelBusAdapter , vytvořte ho pomocí průvodce rozšířením Modelbus:

    1. 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.

    2. 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.

    3. 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.

    4. Klikněte na OK. Do řešení DSL se přidá nový projekt ModelBusAdapter.

    5. Klikněte na Transformovat všechny šablony.

    6. Znovu sestavte řešení.

  2. 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 :

    1. V Průzkumníku Windows zkopírujte a vložte složku obsahující ModelBusAdapter.csproj.

    2. Přejmenujte soubor projektu (například na T4ModelBusAdapter.csproj).

    3. 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.

    4. V každém *.tt souboru nového projektu změňte obor názvů.

    5. 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ů.

    6. V projektu DslPackage přidejte odkaz na nový projekt adaptéru, aby byl odkaz na oba adaptéry.

    7. V DslPackage\source.extension.tt přidejte řádek, který odkazuje na nový projekt adaptéru.

      <MefComponent>|T4ModelBusAdapter|</MefComponent>
      
    8. Transformujte všechny šablony a znovu sestavte řešení. Nemělo by docházet k žádným chybám sestavení.

  3. 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
  4. 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.

  5. 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:

  1. Vytvořte dvě seznamy DSLS. Jeden DSL, Příjemce, má ModelBusReference vlastnost, která může odkazovat na druhý DSL, poskytovatel.

  2. Ve zprostředkovateli vytvořte dva adaptéry ModelBus: jeden pro přístup pomocí textových šablon, druhý pro běžný kód.

  3. Vytvořte modely instancí seznamů DSL v jednom experimentálním projektu.

  4. Nastavte vlastnost domény v jednom modelu tak, aby odkazovat na druhý model.

  5. Napište obslužnou rutinu poklikání, která otevře model, na který odkazuje.

  6. 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

  1. 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".

  2. 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.

  3. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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

  5. DslPackage V projektu přidejte odkaz na T4ModelBusAdapterprojekt .

  6. Do dslPackage\source.extension.tt přidejte následující řádek pod <Content>.

    <MefComponent>|T4ModelBusAdapter|</MefComponent>

  7. T4ModelBusAdapter V projektu přidejte odkaz na: Microsoft.VisualStudio.TextTemplating.Modeling.11.0

  8. Otevřete T4ModelBusAdapter\AdapterManager.tt:

    1. 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
          {
      
    2. 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
      {
      }
      
  9. V záhlaví Průzkumník řešení klikněte na Transformovat všechny šablony.

  10. Stiskněte klávesu F5.

  11. 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

  1. Vytvořte novou DSL pomocí šablony řešení Minimal Language. Pojmenujte jazyk MBConsumer a nastavte příponu názvu souboru na ".consume".

  2. 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 vyhledejte MBProvider\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é.

  3. 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.

  4. Ve třídě ExampleElementpřidejte novou vlastnost MBRdomény a v okno Vlastnosti nastavte jeho typ na ModelBusReference.

  5. 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.

  6. 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í

  1. V řešení MBConsumer stiskněte kombinaci kláves CTRL+F5. Experimentální instance sady Visual Studio se otevře v projektu MBConsumer\Debugging .

  2. 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í.

    1. 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.

    2. V dialogovém okně Přidat položku nastavte filtr na Všechny soubory (*.*).

    3. Přejděte na MBProvider\Debugging\Sample.provide příkaz Přidat a klikněte na tlačítko Přidat.

  3. Otevře záznam typu Sample.consume.

  4. 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ů.

  5. 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ě

  1. 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 atributy inherits direktivy template .

    • 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.

  2. 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

  1. Pokud je spuštěná, zavřete experimentální instanci sady Visual Studio.

  2. 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);
            }
          }
        }
      }
    }
    
  3. Stiskněte Ctrl+F5.

  4. V experimentální instanci sady Visual Studio otevřete Debugging\Sample.consume.

  5. Poklikejte na jeden obrazec.

    Pokud jste pro tento prvek nastavili MBR, otevře se odkazovaný model a vybere se odkazovaný prvek.

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 .