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, modeller arasında ve diğer araçlardan modeller arasında bağlantı oluşturmak için bir yöntem sağlar. Örneğin, etki alanına özgü dil (DSL) modellerini ve UML modellerini bağlayabilirsiniz. Tümleşik bir DSL kümesi oluşturabilirsiniz.
Uyarı
Bu makalede açıklanan Visual Studio ModelBus Uzantısı artık indirilemez. Ancak, bu yönergeler bu uzantıyı zaten yüklemiş olan kullanıcılar için çalışmaya devam etmektedir.
ModelBus, bir modele veya modelin içindeki belirli bir öğeye benzersiz bir başvuru oluşturmanıza olanak tanır. Bu başvuru modelin dışında, örneğin başka bir modeldeki bir öğede depolanabilir. Daha sonraki bir durumda, bir araç öğeye erişim elde etmek istediğinde, ModelBus altyapısı uygun modeli yükler ve öğeyi döndürür. İsterseniz modeli kullanıcıya görüntüleyebilirsiniz. Dosyaya önceki konumunda erişilemiyorsa, ModelBus kullanıcıdan dosyayı bulmasını ister. Kullanıcı dosyayı bulursa, ModelBus bu dosyaya yapılan tüm başvuruları güncelleştirir.
Not
ModelBus'ın geçerli Visual Studio uygulamasında, bağlı modellerin aynı Visual Studio çözümündeki öğeler olması gerekir.
ModelBus Uzantısı hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:
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.
DSL'ye erişim sağlama
Bir modele veya öğelerine ModelBus başvuruları oluşturmadan önce DSL için bir ModelBusAdapter tanımlayın. Birini tanımlamanın en kolay yolu, DSL Tasarım Aracı komutları ekleyen Visual Studio ModelBus Uzantısı'nı kullanmaktır.
DSL tanımını ModelBus'ta kullanıma sunma
DSL tanım dosyasını açın. Tasarım yüzeyine sağ tıklayın ve ardından ModelBus'ı Etkinleştir'i seçin.
İletişim kutusunda Bu DSL'yi ModelBus'a göstermek istiyorum'u 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'ı seçin. DSL çözümüne yeni bir proje
ModelBusAdaptereklenir.DSL'ye bir metin şablonundan erişmek istiyorsanız, yeni projedeki AdapterManager.tt değiştirmeniz gerekir. DSL'ye komutlar ve olay işleyicileri gibi diğer kodlardan erişmek istiyorsanız bu adımı atlayın. Daha fazla bilgi için bkz . Metin Şablonunda Visual Studio ModelBus kullanma.
öğesinin temel sınıfını
AdapterManagerBaseVsTextTemplatingModelingAdapterManager olarak değiştirin.Dosyanın sonuna yakın bir noktada şu özniteliği sınıfının
AdapterManagerönüne ekleyin:[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]Projenin NuGet Paket Yöneticisi
ModelBusAdapteriçine bir NuGet PackageReferenceMicrosoft.VisualStudio.TextTemplating.Modelingekleyin.DSL'ye hem metin şablonlarından hem de diğer kodlardan erişmek istiyorsanız, biri değiştirilmiş ve diğeri değiştirilmemiş olmak üzere iki bağdaştırıcıya ihtiyacınız vardır.
Tüm Şablonları Dönüştür'ü seçin.
Çözümü yeniden oluşturun.
ModelBus artık bu DSL örneklerini açabilir.
ModelBusAdapters\bin* klasörü, proje ve
ModelBusAdaptersproje tarafındanDsloluşturulan derlemeleri içerir. Bu DSL'ye başka bir DSL'den başvurmak için bu derlemeleri içeri aktarin.
Öğelere başvurulabildiğine emin olun
Varsayılan olarak, Visual Studio ModelBus bağdaştırıcıları tanımlamak için bir öğenin GUID'sini kullanır. Bu tanımlayıcıların model dosyasında kalıcı olması gerekir.
Öğe kimliklerinin kalıcı olduğundan emin olmak için:
DslDefinition.dsl dosyasını açın.
DSL Gezgini'nde Xml Serileştirme Davranışı'nın ardından Sınıf Verileri'nin kapsamını genişletin.
ModelBus başvuruları oluşturmak istediğiniz her sınıf için:
Sınıf düğümünü seçin ve Özellikler penceresinde Kimliği Seri Hale Getir'in olarak ayarlandığından
trueemin olun.
Alternatif olarak, GUID yerine öğeleri tanımlamak için öğe adlarını kullanmak istiyorsanız, oluşturulan bağdaştırıcıların bölümlerini geçersiz kılabilirsiniz. Bağdaştırıcı sınıfında aşağıdaki yöntemleri geçersiz kılın:
- Kullanmak istediğiniz tanımlayıcıyı döndürmek için geçersiz kılın
GetElementId. Başvurular oluşturulurken bu yöntem çağrılır. - ModelBus başvurusundan doğru öğeyi bulmak için geçersiz kılın
ResolveElementReference.
Başka bir DSL'den DSL'ye erişme
ModelBus başvurularını DSL'deki bir etki alanı özelliğinde depolayabilir ve bunları kullanan özel kod yazabilirsiniz. Ayrıca, bir model dosyası ve içindeki bir öğeyi seçerek kullanıcının modelBus başvurusu oluşturmasına da izin vekleyebilirsiniz.
Bir DSL'nin başka bir DSL'ye yönelik başvuruları kullanmasını sağlamak için önce bunu model veri yolu başvurularının tüketicisi yapmalısınız.
Bir DSL'nin kullanıma sunulan DSL başvurularını tüketmesini sağlamak için
DSL Tanımı diyagramında diyagramın ana bölümüne sağ tıklayın ve ardından ModelBus'ı Etkinleştir'i seçin.
İletişim kutusunda Bu modelin model veri yolu başvurularını tüketmesini sağlamak istiyorum'ı seçin.
Tüketen
DslDSL projesinde, proje başvurularına aşağıdaki derlemeleri ekleyin. Bu derlemeler (.dll dosyaları), kullanıma sunulan DSL'nin ModelBusAdapter\bin\* dizininde bulunur.Kullanıma sunulan DSL derlemesi, örneğin Fabrikam.FamilyTree.Dsl.dll
Kullanıma sunulan model veri yolu bağdaştırıcısı derlemesi, örneğin Fabrikam.FamilyTree.ModelBusAdapter.dll
Tüketen DSL projesinin proje başvurularına aşağıdaki .NET derlemelerini ekleyin.
- Microsoft.VisualStudio.Modeling.Sdk.Integration.dll
- Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell.dll
ModelBusReference'ı bir etki alanı özelliğinde depolamak için
Tüketen DSL'nin DSL Tanımı'nda, etki alanı sınıfına bir etki alanı özelliği ekleyin ve adını ayarlayın.
Özellikler penceresinde, etki alanı özelliği seçili durumdayken Tür
ModelBusReferenceolarak ayarlayın.Bu aşamada, program kodu özellik değerini ayarlayabilir. Değer, Özellikler penceresinde salt okunurdur.
Kullanıcıların özel bir ModelBusReference düzenleyicisiyle özelliğini ayarlamasına izin vekleyebilirsiniz. Bu düzenleyicinin veya seçicinin iki sürümü vardır. Bunlardan biri kullanıcıların bir model dosyası seçmesine, diğeri ise kullanıcıların model içinde bir model dosyası ve bir öğe seçmesine olanak tanır.
Kullanıcının bir etki alanı özelliğinde ModelBusReference ayarlamasına izin vermek için
Etki alanı özelliğine sağ tıklayın ve ardından ModelBusBaşvurusunu Düzenle'yi seçin. Model Veri Yolu Seçici iletişim kutusu açılır.
Uygun ModelBusReference türünü bir modele veya model içindeki bir öğeye ayarlayın.
Dosya iletişim kutusu filtre dizesine gibi
Family Tree files |*.ftreebir dize girin. Kullanıma sunulan DSL'nizin dosya uzantısını değiştirin.Modeldeki bir öğeye başvurmayı seçerseniz, kullanıcının seçebileceği türlerin listesini ekleyebilirsiniz, örneğin
Company.FamilyTree.Person.Tamam'ı ve ardından Çözüm Gezgini araç çubuğunda Tüm Şablonları Dönüştür'ü seçin.
Uyarı
Geçerli bir model veya varlık seçmediyseniz, etkin görünse bile Tamam düğmesinin hiçbir etkisi olmaz.
gibi
Company.FamilyTree.Personhedef türlerin listesini belirttiyseniz, DSL projenize bir derleme başvurusu eklemeniz ve hedef DSL'nin DLL'sine başvurmanız gerekir; örneğin, Company.FamilyTree.Dsl.dll.
ModelBusReference'ı test etmek için
Hem kullanıma sunulan hem de tüketen DLL'leri oluşturun.
F5 veya CTRL+F5 tuşlarına basarak DCL'lerden birini deneysel modda çalıştırın.
Visual Studio'nun deneysel örneğindeki Hata Ayıklama projesinde, her DSL örneği olan dosyaları ekleyin.
Not
Visual Studio ModelBus yalnızca aynı Visual Studio çözümündeki öğeler olan modellere yapılan başvuruları çözümleyebilir. Örneğin, dosya sisteminizin başka bir bölümünde model dosyasına başvuru oluşturamazsınız.
Kullanıma sunulan DSL örneğinde bazı öğeler ve bağlantılar oluşturun ve kaydedin.
Tüketen DSL'nin bir örneğini açın ve model veri yolu başvuru özelliğine sahip bir model öğesi seçin.
Özellikler penceresinde model veri yolu başvurusu özelliğine çift tıklayın. Seçici iletişim kutusu açılır.
Gözat'ı seçin ve kullanıma sunulan DSL örneğini seçin.
Öğeye özgü model veri yolu başvuruyu belirttiyseniz seçici, modelde bir öğe seçmenize de olanak tanır.
Program kodunda başvuru oluşturma
Bir modele veya modelin içindeki bir öğeye başvuru depolamak istediğinizde, bir ModelBusReferenceoluşturun. İki tür ModelBusReferencevardır: model başvuruları ve öğe başvuruları.
Model başvurusu oluşturmak için modelin örnek olduğu DSL'nin AdapterManager'ına ve modelin dosya adına veya Visual Studio proje öğesine ihtiyacınız vardır.
Öğe başvurusu oluşturmak için model dosyası ve başvurmak istediğiniz öğe için bir bağdaştırıcı gerekir.
Not
Visual Studio ModelBus ile yalnızca aynı Visual Studio çözümündeki öğelere başvuru oluşturabilirsiniz.
Kullanıma sunulan DSL derlemelerini içeri aktarma
Tüketen projede, DSL'ye ve ModelBusAdapter kullanıma sunulan DSL'nin derlemelerine proje başvuruları ekleyin.
Örneğin, ModelBus başvurularını MusicLibrary DSL öğelerinde depolamak istediğinizi varsayalım. ModelBus başvuruları FamilyTree DSL öğelerine başvurur. Başvurular düğümünde Dsl , MusicLibrary çözümünün projesinde aşağıdaki derlemelere başvurular ekleyin:
Fabrikam.FamilyTree.Dsl.dll. Kullanıma sunulan DSL.
Fabrikam.FamilyTree.ModelBusAdapters.dll Kullanıma sunulan DSL'nin ModelBus bağdaştırıcısı.
Microsoft.VisualStudio.Modeling.Sdk.Integration
Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell
Bu derlemeler, kullanıma sunulan DSL projesinde
ModelBusAdapters*bin\** altında bulunabilir.Başvuruları oluşturduğunuz kod dosyasında genellikle şu ad alanlarını içeri aktarmanız gerekir:
// The namespace of the DSL you want to reference:
using Fabrikam.FamilyTree; // Exposed DSL
using Fabrikam.FamilyTree.ModelBusAdapters;
using Microsoft.VisualStudio.Modeling.Integration;
using System.Linq;
...
Modele başvuru oluşturmak için
Model başvurusu oluşturmak için, kullanıma sunulan DSL için AdapterManager'a erişip modele başvuru oluşturmak için bunu kullanırsınız. Bir dosya yolu veya belirtebilirsiniz EnvDTE.ProjectItem.
AdapterManager'dan modeldeki tek tek öğelere erişim sağlayan bir Bağdaştırıcı elde edebilirsiniz.
Not
Bitirdiğinizde bağdaştırıcıyı atmalısınız. Bunu başarmak için en uygun yol bir using deyimidir. Aşağıdaki örnek bunu göstermektedir.
// The file path of a model instance of the FamilyTree DSL:
string targetModelFile = "TudorFamilyTree.ftree";
// Get the ModelBus service:
IModelBus modelBus =
this.Store.GetService(typeof(SModelBus)) as IModelBus;
// Get an adapterManager for the target DSL:
FamilyTreeAdapterManager manager =
(modelbus.GetAdapterManager(FamilyTreeAdapter.AdapterId)
as FamilyTreeAdapterManager;
// or: (modelBus.FindAdapterManagers(targetModelFile).First())
// or could provide an EnvDTE.ProjectItem
// Create a reference to the target model:
// NOTE: the target model must be a file in this project.
ModelBusReference modelReference =
manager.CreateReference(targetModelFile);
// or can use an EnvDTE.ProjectItem instead of the filename
// Get the root element of this model:
using (FamilyTreeAdapter adapter =
modelBus.CreateAdapter(modelReference) as FamilyTreeAdapter)
{
FamilyTree modelRoot = adapter.ModelRoot;
// Access elements under the root in the usual way:
foreach (Person p in modelRoot.Persons) {...}
// You can create adapters for individual elements:
ModelBusReference elementReference =
adapter.GetElementReference(person);
...
} // Dispose adapter
Daha sonra kullanabilmek modelReference istiyorsanız, bunu Dış Türü ModelBusReferenceolan bir etki alanı özelliğinde depolayabilirsiniz:
using Transaction t = this.Store.TransactionManager
.BeginTransaction("keep reference"))
{
artist.FamilyTreeReference = modelReference;
t.Commit();
}
Kullanıcıların bu etki alanı özelliğini düzenlemesine izin vermek için özniteliğinde Editor parametresi olarak kullanınModelReferenceEditor. Daha fazla bilgi için bkz . Kullanıcının Başvuru düzenlemesine izin verme.
Bir öğeye başvuru oluşturmak için
Model için oluşturduğunuz bağdaştırıcı, başvuruları oluşturmak ve çözümlemek için kullanılabilir.
// person is an element in the FamilyTree model:
ModelBusReference personReference =
adapter.GetElementReference(person);
Daha sonra kullanabilmek elementReference istiyorsanız, bunu Dış Türü ModelBusReferenceolan bir etki alanı özelliğinde depolayabilirsiniz. Kullanıcıların düzenlemesine izin vermek için özniteliğinde Editor parametresi olarak kullanınModelElementReferenceEditor. Daha fazla bilgi için bkz . Kullanıcının Başvuru düzenlemesine izin verme.
Başvuruları çözümleme
Bir (MBR) varsa ModelBusReference , başvurduğu modeli veya model öğesini elde edebilirsiniz. Öğe bir diyagramda veya başka bir görünümde gösteriliyorsa, görünümü açabilir ve öğesini seçebilirsiniz.
MBR'den bağdaştırıcı oluşturabilirsiniz. Bağdaştırıcıdan modelin kökünü alabilirsiniz. Model içindeki belirli öğelere başvuran MBR'leri de çözümleyebilirsiniz.
using Microsoft.VisualStudio.Modeling.Integration; ...
ModelBusReference elementReference = ...;
// Get the ModelBus service:
IModelBus modelBus =
this.Store.GetService(typeof(SModelBus)) as IModelBus;
// Use a model reference or an element reference
// to obtain an adapter for the target model:
using (FamilyTreeAdapter adapter =
modelBus.CreateAdapter(elementReference) as FamilyTreeAdapter)
// or CreateAdapter(modelReference)
{
// Get the root of the model:
FamilyTree tree = adapter.ModelRoot;
// Get a model element:
MyDomainClass mel =
adapter.ResolveElementReference<MyDomainClass>(elementReference);
if (mel != null) {...}
// Get the diagram or other view, if there is one:
ModelBusView view = adapter.GetDefaultView();
if (view != null)
{
view.Open();
// Display the diagram:
view.Show();
// Attempt to select the shape that presents the element:
view.SetSelection(elementReference);
}
} // Dispose the adapter.
Metin şablonunda ModelBusReferences'ı çözümlemek için
Erişmek istediğiniz DSL'de metin şablonları tarafından erişim için yapılandırılmış bir ModelBus Bağdaştırıcısı olmalıdır. Daha fazla bilgi için bkz . DSL'ye Erişim Sağlama.
Genellikle kaynak DSL'de depolanan model veri yolu başvurusu (MBR) kullanarak hedef DSL'ye erişebilirsiniz. Bu nedenle şablonunuz kaynak DSL yönergesini ve MBR'yi çözümleme kodunu içerir. Metin şablonları hakkında daha fazla bilgi için bkz . Etki Alanına Özgü Bir Dilden Kod Oluşturma.
<#@ template debug="true" hostspecific="true"
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 = "System.Core" #>
<#@ assembly name = "Company.CompartmentDragDrop.Dsl.dll" #>
<#@ assembly name = "Company.CompartmentDragDrop.ModelBusAdapter.dll" #>
<#@ import namespace="Microsoft.VisualStudio.Modeling.Integration" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="Company.CompartmentDragDrop" #>
<#@ import namespace="Company.CompartmentDragDrop.ModelBusAdapters" #>
<# // Get source root from directive processor:
ExampleModel source = this.ExampleModel;
// This DSL has an MBR in its root:
using (ModelBusAdapter adapter = this.ModelBus.CreateAdapter(source.ModelReference) as ModelBusAdapter)
{
ModelBusAdapterManager manager = this.ModelBus.FindAdapterManagers(this.Host.ResolvePath("Sample.compDD1")).FirstOrDefault();
ModelBusReference modelReference =
manager.CreateReference(this.Host.ResolvePath("Sample.compDD1"));
// Get the root element of this model:
using (CompartmentDragDropAdapter adapter =
this.ModelBus.CreateAdapter(modelReference) as CompartmentDragDropAdapter)
{
ModelRoot root = adapter.ModelRoot;
#>
[[<#= root.Name #>]]
<#
}
#>
Daha fazla bilgi ve izlenecek yol için bkz . Metin Şablonunda Visual Studio ModelBus Kullanma
ModelBusReference serileştirme
Bir ModelBusReference (MBR) dize biçiminde depolamak istiyorsanız, seri hale getirebilirsiniz:
string serialized = modelBus.SerializeReference(elementReference);
// Store it anywhere, then get it back again:
ModelBusReference elementReferenceRestored =
modelBus.DeserializeReference(serialized, null);
Bu şekilde seri hale getirilen bir MBR, bağlamdan bağımsızdır. Basit dosya tabanlı Model Veri Yolu Bağdaştırıcısı kullanıyorsanız, MBR mutlak bir dosya yolu içerir. Örnek modeli dosyaları hiçbir zaman taşınmazsa, bu serileştirme yeterlidir. Ancak model dosyaları genellikle Visual Studio projesindeki öğelerdir. Kullanıcılarınız projenin tamamını dosya sisteminin farklı bölümlerine taşıyabilmeyi bekliyor. Ayrıca projeyi kaynak denetimi altında tutabilmeyi ve farklı bilgisayarlarda açabilmeyi beklerler. Bu nedenle yol adları, dosyaları içeren projenin konumuna göre seri hale getirilmelidir.
Belirtilen dosya yoluna göre seri hale getirme
A ModelBusReference , serileştirilmesi gereken dosya yolu gibi bilgileri depolayabileceğiniz bir sözlük olan bir ReferenceContextiçerir.
Bir yola göre seri hale getirmek için:
elementReference.ReferenceContext.Add(
ModelBusReferencePropertySerializer.FilePathSaveContextKey,
currentProjectFilePath);
string serialized = modelBus.SerializeReference(elementReference);
Dizeden başvuruyu almak için:
ReferenceContext context = new ReferenceContext();
context.Add(ModelBusReferencePropertySerializer.FilePathLoadContextKey,
currentProjectFilePath);
ModelBusReference elementReferenceRestored =
modelBus.DeserializeReference(serialized, context);
Diğer bağdaştırıcılar tarafından oluşturulan ModelBus başvuruları
Aşağıdaki bilgiler, kendi bağdaştırıcınızı oluşturmak istiyorsanız kullanışlıdır.
( ModelBusReference MBR) iki bölümden oluşur: model veri yolu tarafından seri durumdan çıkarılmış MBR üst bilgisi ve belirli bir bağdaştırıcı yöneticisi tarafından işlenen bağdaştırıcıya özgü. Bu yaklaşım, kendi bağdaştırıcı serileştirme biçiminizi sağlamanıza olanak tanır. Örneğin, dosya yerine bir veritabanına başvurabilir veya bağdaştırıcı başvurusunda ek bilgiler depolayabilirsiniz. Kendi bağdaştırıcınız öğesine ek bilgiler ReferenceContextyerleştirebilir.
Bir MBR'nin seri durumdan çıkarıldığında, MBR nesnesinde depolanan bir ReferenceContext sağlamanız gerekir. Bir MBR'yi seri hale getirdiğinizde, depolanan ReferenceContext, dizenin oluşturulmasına yardımcı olmak için bağdaştırıcı tarafından kullanılır. Seri durumdan çıkarılmış dize ReferenceContext içindeki tüm bilgileri içermez. Örneğin, basit dosya tabanlı bağdaştırıcıda, ReferenceContext bir kök dosya yolu içerir. Yol, serileştirilmiş MBR dizesinde depolanmaz.
MBR iki aşamada seri durumdan çıkarılır:
ModelBusReferencePropertySerializer, MBR üst bilgisi ile ilgilenen standart seri hale getiricidir. anahtarıModelBusReferencePropertySerializer.ModelBusLoadContextKeykullanılarak içindeReferenceContextdepolanan standart DSLSerializationContextözellik paketini kullanır. Özellikle, öğesininSerializationContextbir örneğini içermesiModelBusgerekir.ModelBus Bağdaştırıcınız MBR'nin bağdaştırıcıya özgü bölümüyle ilgilenir. MBR'nin ReferenceContext içinde depolanan ek bilgileri kullanabilir. Basit dosya tabanlı bağdaştırıcı, ve
FilePathSaveContextKeyanahtarlarınıFilePathLoadContextKeykullanarak kök dosya yollarını tutar.Model dosyasındaki bağdaştırıcı başvurusu yalnızca kullanıldığında seri durumdan çıkarılır.
Model oluşturma
Model oluşturma, açma ve düzenleme
Aşağıdaki parça, VMSDK web sitesindeki State Machine örneğinden alınmıştır. Model oluşturmak ve açmak ve modelle ilişkili diyagramı elde etmek için ModelBusReferences kullanımını gösterir.
Bu örnekte hedef DSL'nin adı StateMachine'dir. Model sınıfının adı ve ModelBusAdapter adı gibi çeşitli adlar ondan türetilir.
using Fabrikam.StateMachine.ModelBusAdapters;
using Microsoft.VisualStudio.Modeling;
using Microsoft.VisualStudio.Modeling.Diagrams;
using Microsoft.VisualStudio.Modeling.Integration;
using Microsoft.VisualStudio.Modeling.Integration.Shell;
using Microsoft.VisualStudio.Modeling.Shell;
...
// Create a new model.
ModelBusReference modelReference =
StateMachineAdapterManager .CreateStateMachineModel(modelName, fileName);
//Keep reference of new model in this model.
using (Transaction t = ...)
{
myModelElement.ReferenceProperty = modelReference;
t.Commit();
}
// Get the ModelBus service from Visual Studio.
IModelBus modelBus = Microsoft.VisualStudio.Shell.Package.
GetGlobalService(typeof(SModelBus)) as IModelBus;
// Get a modelbus adapter on the new model.
ModelBusAdapter modelBusAdapter;
modelBus.TryCreateAdapter(modelReference,
this.ServiceProvider, out modelBusAdapter);
using (StateMachineAdapter adapter =
modelBusAdapter as StateMachineAdapter)
{
if (adapter != null)
{
// Obtain a Diagram from the adapter.
Diagram targetDiagram =
((StandardVsModelingDiagramView)
adapter.GetDefaultView()
).Diagram;
using (Transaction t =
targetDiagram.Store.TransactionManager
.BeginTransaction("Update diagram"))
{
DoUpdates(targetDiagram);
t.Commit();
}
// Display the new diagram.
adapter.GetDefaultView().Show();
}
}
Başvuruları doğrulama
BrokenReferenceDetector, ModelBusReferences'i barındırabilen bir Store'daki tüm etki alanı özelliklerini test eder. Herhangi bir eylemin bulunduğu yeri sağlayan eylemi çağırır. Bu test doğrulama yöntemleri için yararlıdır. Aşağıdaki doğrulama yöntemi, modeli kaydetme girişiminde depoyu test eder ve hatalar penceresinde bozuk başvurular bildirir:
[ValidationMethod(ValidationCategories.Save)]
public void ValidateModelBusReferences(ValidationContext context)
{
BrokenReferenceDetector.DetectBrokenReferences(this.Store,
delegate(ModelElement element, // parent of property
DomainPropertyInfo property, // identifies property
ModelBusReference reference) // invalid reference
{
context.LogError(string.Format(INVALID_REF_FORMAT,
property.Name,
referenceState.Name,
new ModelBusReferenceTypeConverter().
ConvertToInvariantString(reference)),
"Reference",
element);
});
}
private const string INVALID_REF_FORMAT =
"The '{0}' domain property of this ReferenceState instance "
+ "named '{1}' contains reference value '{2}' which is invalid";
ModelBus Uzantısı tarafından gerçekleştirilen eylemler
ModelBus'un kapsamlı bir şekilde kullanılması durumunda aşağıdaki bilgiler yararlı olabilir.
ModelBus Uzantısı DSL çözümünüzde aşağıdaki değişiklikleri yapar.
DSL Tanımı diyagramına sağ tıkladığınızda Modelbus'ı Etkinleştir'i ve ardından ModelBus'ı Kullanmak için Bu DSL'yi Etkinleştir'i seçin:
DSL projesinde, Microsoft.VisualStudio.Modeling.Sdk.Integration.dll bir başvuru eklenmelidir.
DSL Tanımı'na bir Dış Tür başvurusu eklenir:
Microsoft.VisualStudio.Modeling.Integration.ModelBusReference.Başvuruyu DSL Gezgini'nde, Etki Alanı Türleri'nin altında görebilirsiniz. Dış tür başvurularını el ile eklemek için kök düğüme sağ tıklayın.
Dsl\GeneratedCode\ModelBusReferencesSerialization.tt adlı yeni bir şablon dosyası eklenir.
Bir etki alanı özelliğinin türünü ModelBusReference olarak ayarladığınızda ve ardından özelliğe sağ tıklayıp ModelBusReference'a özgü özellikleri etkinleştir'i seçtiğinizde:
Etki alanı özelliğine birkaç CLR özniteliği eklenir. Bunları Özellikler penceresindeki Özel Öznitelikler alanında görebilirsiniz. Dsl\GeneratedCode\DomainClasses.cs'da öznitelikleri özellik bildiriminde görebilirsiniz:
[System.ComponentModel.TypeConverter(typeof( Microsoft.VisualStudio.Modeling.Integration.ModelBusReferenceTypeConverter))] [System.ComponentModel.Editor(typeof( Microsoft.VisualStudio.Modeling.Integration.Picker .ModelReferenceEditor // or ModelElementReferenceEditor ), typeof(System.Drawing.Design.UITypeEditor))] [Microsoft.VisualStudio.Modeling.Integration.Picker .SupplyFileBasedBrowserConfiguration ("Choose a model file", "Target model|*.target")]
DSL Tanım Diyagramı'na sağ tıkladığınızda ModelBus'ı Etkinleştir'i ve ardından Bu DSL'yi ModelBus'a göster'i seçin:
Çözüme yeni bir proje
ModelBusAdaptereklenir.projesine
ModelBusAdapterDslPackagebir başvurusu eklenir.ModelBusAdapterprojeye bir başvuruyaDslsahiptir.DslPackage\source.extention.tt içinde MEF
|ModelBusAdapter|Bileşeni olarak eklenir.