Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Visual Studio ModelBus başvurularını içeren bir modeli okuyan metin şablonları yazarsanız, hedef modellere erişmek için başvuruları çözümlemek isteyebilirsiniz. Bu durumda, metin şablonlarını ve başvurulan etki alanına özgü dilleri (DLL' ler) uyarlamanız gerekir:
Başvuruların hedefi olan DSL,metin şablonlarından erişim için yapılandırılmış bir ModelBus Bağdaştırıcısına sahip olmalıdır. DSL'ye başka bir koddan da erişiyorsa, standart ModelBus Bağdaştırıcısı'na ek olarak yeniden yapılandırılmış bağdaştırıcı gereklidir.
Bağdaştırıcı yöneticisi VsTextTemplatingModelingAdapterManager'dan devralmalıdır ve özniteliğine
[HostSpecific(HostName)]sahip olmalıdır.Şablonun ModelBusEnabledTextTransformation'dan devralması gerekir.
Not
ModelBus başvuruları içermeyen DSL modellerini okumak istiyorsanız, DSL projelerinizde oluşturulan yönerge işlemcilerini kullanabilirsiniz. Daha fazla bilgi için bkz . Metin Şablonlarından Modellere Erişme.
Metin şablonları hakkında daha fazla bilgi için bkz . T4 Metin Şablonlarını kullanarak Tasarım Zamanı Kodu Oluşturma.
Metin Şablonlarından Erişim için Model Veri Yolu Bağdaştırıcısı Oluşturma
Metin şablonundaki ModelBus başvurularını çözümlemek için hedef DSL'nin uyumlu bir bağdaştırıcıya sahip olması gerekir. Metin şablonları Visual Studio belge düzenleyicilerinden ayrı bir AppDomain içinde yürütülür ve bu nedenle bağdaştırıcının modeli DTE aracılığıyla erişmek yerine yüklemesi gerekir.
Hedef DSL çözümünün ModelBusAdapter projesi yoksa, Modelbus Uzantısı sihirbazını kullanarak bir proje oluşturun:
Henüz yapmadıysanız Visual Studio ModelBus Uzantısı'nı indirin ve yükleyin. Daha fazla bilgi için bkz . Görselleştirme ve Modelleme SDK'sı.
DSL tanım dosyasını açın. Tasarım yüzeyine sağ tıklayın ve ardından Modelbus'ı Etkinleştir'e tıklayın.
İletişim kutusunda Bu DSL'yi ModelBus'a göstermek istiyorum'ı seçin. Bu DSL'nin hem modellerini kullanıma sunmasını hem de diğer DLL'lere yönelik başvuruları kullanmasını istiyorsanız her iki seçeneği de belirleyebilirsiniz.
Tamam'a tıklayın. DSL çözümüne yeni bir "ModelBusAdapter" projesi eklendi.
Tüm Şablonları Dönüştür'e tıklayın.
Çözümü yeniden oluşturun.
DSL'ye hem metin şablonundan hem de komut gibi başka bir koddan erişmek istiyorsanız ModelBusAdapter projesini çoğaltın:
Windows Gezgini'nde, ModelBusAdapter.csproj dosyasını içeren klasörü kopyalayıp yapıştırın.
Proje dosyasını yeniden adlandırın (örneğin, T4ModelBusAdapter.csproj olarak).
Çözüm Gezgini çözüm düğümüne sağ tıklayın, Ekle'nin üzerine gelin ve Var Olan Proje'ye tıklayın. T4ModelBusAdapter.csproj yeni bağdaştırıcı projesini bulun.
Yeni projenin her
*.ttdosyasında ad alanını değiştirin.Çözüm Gezgini'da yeni projeye sağ tıklayın ve ardından Özellikler'e tıklayın. Özellikler düzenleyicisinde, oluşturulan derlemenin adlarını ve varsayılan ad alanını değiştirin.
DslPackage projesinde, her iki bağdaştırıcıya da başvurular olması için yeni bağdaştırıcı projesine bir başvuru ekleyin.
DslPackage\source.extension.tt'da yeni bağdaştırıcı projenize başvuran bir satır ekleyin.
<MefComponent>|T4ModelBusAdapter|</MefComponent>Tüm Şablonları Dönüştürün ve çözümü yeniden oluşturun. Derleme hatası oluşmamalıdır.
Yeni bağdaştırıcı projesinde, aşağıdaki derlemelere başvurular ekleyin:
- Microsoft.VisualStudio.TextTemplating.11.0
- Microsoft.VisualStudio.TextTemplating.Modeling.11.0
In AdapterManager.tt:
AdapterManagerBase bildirimini VsTextTemplatingModelingAdapterManager'dan devralması için değiştirin.
public partial class <#= dslName =>AdapterManagerBase :Microsoft.VisualStudio.TextTemplating.Modeling.VsTextTemplatingModelingAdapterManager { ...Dosyanın sonuna yakın bir şekilde AdapterManager sınıfından önce HostSpecific özniteliğini değiştirin. Aşağıdaki satırı kaldırın:
[DslIntegration::HostSpecific(DslIntegrationShell::VsModelingAdapterManager.HostName)]Aşağıdaki satırı ekleyin:
[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]Bu öznitelik, modelbus tüketicisi bir bağdaştırıcıyı ararken kullanılabilen bağdaştırıcı kümesini filtreler.
Tüm Şablonları Dönüştürün ve çözümü yeniden oluşturun. Derleme hatası oluşmamalıdır.
ModelBus Başvurularını Çözümleyebilen Bir Metin Şablonu Yazma
Genellikle, bir "kaynak" DSL'den dosya okuyan ve oluşturan bir şablonla başlarsınız. Bu şablon, kaynak DSL projesinde oluşturulan yönergeyi kullanarak kaynak model dosyalarını Metin Şablonlarından Modellere Erişme bölümünde açıklanan şekilde okur. Ancak, kaynak DSL bir "hedef" DSL'ye ModelBus Başvuruları içerir. Bu nedenle, başvuruları çözümlemek ve hedef DSL'ye erişmek için şablon kodunu etkinleştirmek istiyorsunuz. Bu nedenle şu adımları izleyerek şablonu uyarlamanız gerekir:
Şablonun temel sınıfını ModelBusEnabledTextTransformation olarak değiştirin.
Şablon yönergesine ekleyin
hostspecific="true".Hedef DSL'ye ve bağdaştırıcısına derleme başvuruları ekleyin ve ModelBus'ı etkinleştirin.
Hedef DSL'nin bir parçası olarak oluşturulan yönergeye ihtiyacınız yoktur.
<#@ 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.
#>
Bu metin şablonu yürütürken yönergesi SourceDsl dosyasını Sample.sourceyükler. Şablon, öğesinden başlayarak bu modelin öğelerine this.ModelRooterişebilir. Kod, bu DSL'nin etki alanı sınıflarını ve özelliklerini kullanabilir.
Ayrıca, şablon ModelBus Başvurularını çözümleyebilir. Başvurular Hedef modeli gösterdiğinde, derleme yönergeleri kodun bu modelin DSL'sinin etki alanı sınıflarını ve özelliklerini kullanmasına izin verir.
DSL projesi tarafından oluşturulan bir yönerge kullanmıyorsanız, aşağıdakileri de eklemeniz gerekir.
<#@ assembly name = "Microsoft.VisualStudio.Modeling.Sdk.11.0" #> <#@ assembly name = "Microsoft.VisualStudio.TextTemplating.Modeling.11.0" #>ModelBus'a erişim elde etmek için kullanın
this.ModelBus.
İzlenecek yol: ModelBus Kullanan Bir Metin Şablonunu Test Etme
Bu kılavuzda şu adımları izleyin:
İki DLL oluşturma. Bir DSL(Tüketici) diğer DSL'ye (Sağlayıcı) başvurabilen bir
ModelBusReferenceözelliğe sahiptir.Sağlayıcıda iki ModelBus Bağdaştırıcısı oluşturun: biri metin şablonlarına, diğeri de normal koda göre erişim için.
Tek bir deneysel projede DLL'lerin örnek modellerini oluşturun.
Bir modelde bir etki alanı özelliğini diğer modeli işaret etmek için ayarlayın.
İşaret edilen modeli açan bir çift tıklama işleyicisi yazın.
İlk modeli yükleyebilen bir metin şablonu yazın, diğer modele başvuruyu izleyin ve diğer modeli okuyun.
ModelBus tarafından erişilebilen bir DSL oluşturma
Yeni bir DSL çözümü oluşturun. Bu örnek için Görev Akışı çözüm şablonunu seçin. Dil adını olarak
MBProviderve dosya adı uzantısını ".provide" olarak ayarlayın.DSL Tanımı diyagramında, diyagramın üst kısımda olmayan boş bir bölümüne sağ tıklayın ve ardından Modelbus'ı Etkinleştir'e tıklayın.
Modelbus'ı Etkinleştir seçeneğini görmüyorsanız VMSDK ModelBus uzantısını indirin ve yükleyin.
Modelbus'ı Etkinleştir iletişim kutusunda Bu DSL'yi ModelBus'ta kullanıma seçip Tamam'a tıklayın.
Çözüme
ModelBusAdapteryeni bir proje ( ) eklenir.
Artık ModelBus aracılığıyla metin şablonları tarafından erişilebilen bir DSL'niz var. Buna yönelik başvurular, tümü model dosya düzenleyicisinin AppDomain'inde çalışan komutlar, olay işleyicileri veya kurallar kodunda çözümlenebilir. Ancak metin şablonları ayrı bir AppDomain içinde çalışır ve düzenlendiğinde modele erişemez. Bu DSL'ye yönelik ModelBus başvurularına bir metin şablonundan erişmek istiyorsanız, ayrı bir ModelBusAdapter'a sahip olmanız gerekir.
Metin Şablonları için yapılandırılmış bir ModelBus Bağdaştırıcısı oluşturma
Dosya Gezgini'da, ModelBusAdapter.csproj dosyasını içeren klasörü kopyalayıp yapıştırın.
Klasörü T4ModelBusAdapter olarak adlandırın.
T4ModelBusAdapter.csproj proje dosyasını yeniden adlandırın.
Çözüm Gezgini mbprovider çözümüne T4ModelBusAdapter ekleyin. Çözüm düğümüne sağ tıklayın, Ekle'nin üzerine gelin ve Var Olan Proje'ye tıklayın.
T4ModelBusAdapter proje düğümüne sağ tıklayın ve ardından Özellikler'e tıklayın. Proje özellikleri penceresinde Derleme Adı ve Varsayılan Ad Alanı'nı olarak
Company.MBProvider.T4ModelBusAdaptersdeğiştirin.T4ModelBusAdapter'daki her *.tt dosyasına, satırın aşağıdakine benzemesi için ad alanının son bölümüne "T4" ekleyin.
namespace <#= CodeGenerationUtilities.GetPackageNamespace(this.Dsl) #>.T4ModelBusAdaptersProjesinde
DslPackage, öğesineT4ModelBusAdapterbir proje başvurusu ekleyin.DslPackage\source.extension.tt altında aşağıdaki satırı
<Content>ekleyin.<MefComponent>|T4ModelBusAdapter|</MefComponent>T4ModelBusAdapterProjeye bir başvuru ekleyin: Microsoft.VisualStudio.TextTemplating.Modeling.11.0T4ModelBusAdapter\AdapterManager.tt'i açın:
AdapterManagerBase'in temel sınıfını VsTextTemplatingModelingAdapterManager olarak değiştirin. Dosyanın bu bölümü artık aşağıdakine benzer.
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 {Dosyanın sonuna yakın bir şekilde AdapterManager sınıfının önüne aşağıdaki ek özniteliği ekleyin.
[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]Sonuç aşağıdakine benzer.
/// <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 { }
Çözüm Gezgini başlık çubuğunda Tüm Şablonları Dönüştür'e tıklayın.
F5 tuşuna basın.
DSL'nin çalıştığını doğrulayın. Deneysel projede dosyasını açın
Sample.provider. Visual Studio'nun deneysel örneğini kapatın.Bu DSL'ye yönelik ModelBus Başvuruları artık metin şablonlarında ve ayrıca normal kodda çözümlenebilir.
ModelBus Başvurusu etki alanı özelliğiyle DSL oluşturma
En Düşük Dil çözüm şablonunu kullanarak yeni bir DSL oluşturun. Dili MBConsumer olarak adlandırın ve dosya adı uzantısını ".consume" olarak ayarlayın.
DSL projesinde MBProvider DSL derlemesine bir başvuru ekleyin. Sağ tıklayın
MBConsumer\Dsl\Referencesve ardından Başvuru Ekle'ye tıklayın. Gözat sekmesindeMBProvider\Dsl\bin\Debug\Company.MBProvider.Dsl.dllBu, diğer DSL'yi kullanan kod oluşturmanıza olanak tanır. Birkaç DLL'ye başvuru oluşturmak istiyorsanız, bunları da ekleyin.
DSL Tanımı diyagramında diyagrama sağ tıklayın ve ardından ModelBus'ı Etkinleştir'e tıklayın. İletişim kutusunda Bu DSL'yi ModelBus'ı Kullanmak için Etkinleştir'i seçin.
sınıfında
ExampleElementyeni bir etki alanı özelliğiMBRekleyin ve Özellikler penceresi türünü olarakModelBusReferenceayarlayın.Diyagramda etki alanı özelliğine sağ tıklayın ve ardından ModelBusBaşvurusunu Düzenle'ye tıklayın. İletişim kutusunda bir model öğesi seçin.
Dosya iletişim kutusu filtresini aşağıdakine ayarlayın.
Provider File|*.provide"|" sonrasındaki alt dize, dosya seçimi iletişim kutusu için bir filtredir. *.* kullanarak herhangi bir dosyaya izin verecek şekilde ayarlayabilirsiniz.
Model Öğesi türü listesinde, sağlayıcı DSL'sindeki bir veya daha fazla etki alanı sınıfının adını girin (örneğin, Company.MBProvider.Task). Bunlar soyut sınıflar olabilir. Listeyi boş bırakırsanız, kullanıcı herhangi bir öğeye başvuru ayarlayabilir.
İletişim kutusunu kapatın ve Tüm Şablonları Dönüştür'ü seçin.
Başka bir DSL'deki öğelere başvuru içerebilen bir DSL oluşturdunuz.
Çözümdeki başka bir dosyaya ModelBus başvurusu oluşturma
MBConsumer çözümünde CTRL+F5 tuşlarına basın. MBConsumer\Debugging projesinde Visual Studio'nun deneysel bir örneği açılır.
MBConsumer\Debugging projesine Sample.provide dosyasının bir kopyasını ekleyin. ModelBus başvurusunun aynı çözümdeki bir dosyaya başvurması gerektiğinden bu gereklidir.
Hata Ayıklama projesine sağ tıklayın, Ekle'nin üzerine gelin ve Varolan Öğe'ye tıklayın.
Öğe Ekle iletişim kutusunda filtreyi Tüm Dosyalar (*.*) olarak ayarlayın.
Adresine
MBProvider\Debugging\Sample.providegidin ve Ekle'ye tıklayın.
Sample.consume'ı açın.Örnek bir şekle tıklayın ve Özellikler penceresi MBR özelliğinde [...] öğesine tıklayın. İletişim kutusunda Gözat'a tıklayın ve öğesini seçin
Sample.provide. Öğeler penceresinde Görev türünü genişletin ve öğelerden birini seçin.Dosyayı kaydedin. (Visual Studio'nun deneysel örneğini henüz kapatmayın.)
Başka bir modeldeki bir öğeye ModelBus başvurusu içeren bir model oluşturdunuz.
Metin şablonunda ModelBus Başvurusu'nu çözümleme
Visual Studio'nun deneysel örneğinde bir örnek metin şablonu dosyası açın. İçeriğini aşağıdaki gibi ayarlayın.
<#@ 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 #> <# } } #>Aşağıdaki noktalara dikkat edin:
hostSpecificyönergesinintemplateveinheritsöznitelikleri ayarlanmalıdır.Tüketici modeline, söz konusu DSL'de oluşturulan yönerge işlemcisi aracılığıyla her zamanki gibi erişilir.
Derleme ve içeri aktarma yönergelerinin ModelBus'a ve sağlayıcı DSL türlerine erişebilmesi gerekir.
Birçok MBR'nin aynı modele bağlandığını biliyorsanız CreateAdapter'ı yalnızca bir kez çağırmak daha iyidir.
Şablonu kaydedin. Sonuçta elde edilen metin dosyasının aşağıdakine benzediğini doğrulayın.
ExampleElement1 ExampleElement2 ExampleElement2 is linked to Task: Task2
Hareket işleyicisinde ModelBus başvurularını çözümleme
Çalışıyorsa Visual Studio'nun deneysel örneğini kapatın.
MBConsumer\Dsl\Custom.cs adlı bir dosya ekleyin ve içeriğini aşağıdaki şekilde ayarlayın:
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); } } } } }Ctrl F5 tuşlarına+ basın.
Visual Studio'nun deneysel örneğinde dosyasını açın
Debugging\Sample.consume.Bir şekle çift tıklayın.
Bu öğede MBR'yi ayarladıysanız, başvuruda bulunan model açılır ve başvuruda bulunan öğe seçilir.
İlgili içerik
Not
Metin Şablonu Dönüştürme bileşeni, Visual Studio uzantısı geliştirme iş yükünün bir parçası olarak otomatik olarak yüklenir. Ayrıca Visual Studio Yükleyicisi Tek tek bileşenler sekmesinden SDK'lar, kitaplıklar ve çerçeveler kategorisinin altından da yükleyebilirsiniz. Tek tek bileşenler sekmesinden Modelleme SDK'sı bileşenini yükleyin.