Интеграция моделей с помощью Visual Studio Modelbus
Visual Studio ModelBus предоставляет метод для создания ссылки между моделями и от других средств в модели.Например, можно связать модели доменного языка (DSL) и моделей UML.Можно создать интегрированный набор DSLs.
ModelBus позволяет создавать уникальные ссылки на модели или к определенному элементу внутри модели.Эта ссылка может быть, хранящихся вне модели, например, в элементе из другой модели.Если в последующем случае средство хочет получать доступ к элементу, инфраструктура шины модели загрузит соответствующую модели и возвращает элемент.При желании можно указать модель для пользователя.Если файл нельзя получить доступ в ее предыдущем местоположении, то ModelBus запросит подтверждение, что пользователь обнаружил ее.Если пользователь ищет файл, то ModelBus фиксирует все ссылки на этот файл.
Примечание |
---|
На протяжении Visual Studio реализация ModelBus, связанные модели должна быть элементами в одном Visual Studio решение. |
Дополнительные сведения и образец кода см. в разделах:
Практическое руководство. Добавление обработчика перетаскивания
Visual Studio Визуализация и моделирование веб-сайте пакета SDK (VMSDK)
Предоставление доступа к DSL
Прежде чем создать ссылки ModelBus на модели или ее элементы, необходимо указать ModelBusAdapter для DSL.Самый простой способ это сделать - воспользоваться Visual Studio Расширение шины модели, добавляющая команды в конструктор DSL.
Предоставить определение для шины модели DSL
Загрузите и установите расширение шины модели Visual Studio, если уже не будет устанавливать его.Дополнительные сведения см. в разделе Пакет SDK для визуализации данных и моделирования.
Откройте файл определения DSL.Щелкните правой кнопкой мыши область конструктора и выберите пункт Включите Modelbus.
В диалоговом окне выбор Сведения об предоставить этот DSL к ModelBus.Можно выбрать оба параметра, если необходимо предоставить этот DSL и ее модели и использовать ссылки на другой DSLs.
Нажмите кнопку ОК.Новый проект "ModelBusAdapter" добавляется в решение DSL.
Если необходимо получить доступ к DSL из текстового шаблона, необходимо изменить AdapterManager.tt в новом проекте.Пропустите этот шаг, если необходимо получить доступ к DSL из другого кода в качестве команды и обработчики событий.Дополнительные сведения см. в разделе Использование Visual Studio ModelBus в текстовом шаблоне.
Измените базовый класс для AdapterManagerBase VsTextTemplatingModelingAdapterManager.
В конце файла вставьте дополнительный атрибут перед классом AdapterManager:
[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]
В ссылках проекта ModelBusAdapter добавьте Microsoft.VisualStudio.TextTemplating.Modeling.11.0.
Если необходимо получить доступ к DSL и из текстовых шаблонов и от другого кода, то потребуется 2 адаптера, измененного одного и одним неизмененным.
Нажать Преобразовать все шаблоны.
Вновь Выполните сборку решения.
Теперь возможно, ModelBus открыть экземпляры этого DSL.
Папка ModelBusAdapters\bin\* содержит сборки, построенные Dsl проект и ModelBusAdapters этот проект.Для ссылки на этот DSL из другого DSL, необходимо импортировать эти сборки.
Выбрав элементы можно ссылаться
Visual Studio Адаптеры ModelBus используют идентификаторы guid для идентификации этого элемента по умолчанию.Эти идентификаторы должны быть сохранены в файле поэтому модели.
Убедиться в том, что идентификаторы сохраняются
Откройте DslDefinition.dsl.
Разверните в обозревателе DSL Реакция на событие сериализации XMLпосле этого Сведения о класса.
Для каждого класса, к которому требуется создать шина модели ссылается на:
Щелкните узел класса и в окне свойства убедитесь, что Сериализация идентификатор. равно true.
Кроме того, если необходимо использовать имена элементов, для определения элементов, а не guids, можно переопределить части созданных адаптеров.Переопределить следующие методы в классах адаптера:
Переопределенный GetElementId возврата идентификатора, который необходимо использовать.Этот метод вызывается для создания ссылки.
Переопределенный ResolveElementReference найти правильный элемент из ссылок шины модели.
Доступ к DSL из другого DSL
Можно сохранить шины модели ссылки в свойстве домена DSL, и можно написать пользовательский код, использующий их.Можно также позволяют пользователю создать ссылку шины модели, выбрать файл модели и элемент внутри нее.
Чтобы разрешить DSL для использования ссылок на другой DSL, необходимо сделать ее a объект-получатель шины модели ссылок.
Включение DSL, чтобы использовать ссылки к предоставленному DSL
В схеме определения DSL, щелкните правой кнопкой мыши основной частью схемы и выберите Включите Modelbus.
В диалоговом окне выберите Сведения об включения этой модели, чтобы использовать ссылки шины модели.
В проекте Dsl с помощью DSL, добавьте следующие сборки к ссылкам на проект.Можно найти эти сборки (.dll) ModelBusAdapter файлы в каталог \ bin \ *, предоставляемого DSL.
Сборка, например, предоставляемая DSL Fabrikam.FamilyTree.Dsl.dll
Сборка адаптера шины модели, предоставляемая, например Fabrikam.FamilyTree.ModelBusAdapter.dll
Добавьте ссылки на следующие сборки .NET в проект с помощью проекта DSL.
Microsoft.VisualStudio.Modeling.Sdk.Integration.11.0.dll
Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell.11.0.dll
Хранение шины модели ссылка в свойстве домена
В определении DSL с использованием домена DSL, добавьте свойство к классу доменному и задайте его имя.
В окне свойства, выбранное свойство домена установите тип В ModelBusReference.
На этом этапе программный код может задать значение свойства, но только для чтения в окне свойства.
Можно разрешить пользователям, чтобы задать свойство, используя специальное редактором ссылка ModelBus.2 Версии данного редактора или средство выбора: он позволяет пользователям выбирать файл модели и другие позволяет пользователям выбирать файл модели и элемент внутри модели.
Позволяет пользователю задать ссылку шины модели в свойстве домена
Щелкните правой кнопкой мыши свойство и выберите пункт домена Свойства ModelBusReference правки определенные.Диалоговое окно открывается.Это Выбор шины модели.
Выберите подходящее Тип ModelBusReference. в модель или в элемент внутри модели.
В строке фильтра диалогового окна файла введите строку как Family Tree files |*.ftree.Subsitute расширение файла проекта, предоставляемого DSL.
Если выбрано для ссылки на элемент в модели, можно добавить список типов, которые пользователь может выбрать, например Company.FamilyTree.Person.
Нажать ОК, а затем нажмите кнопку Преобразовать все шаблоны на панели инструментов обозревателя решений.
Внимание Если не выбран допустимые модель или сущность, кнопка ОК не будет иметь эффекта, даже если он может показаться включено.
Если указан список типов целевых объектов, как Company.FamilyTree.Person, необходимо добавить ссылку на сборку в проект DSL, ссылающийся на библиотеку DLL целевого объекта, например Company.FamilyTree.Dsl.dll DSL
Тестирование ссылка шины модели
Построение и предоставлянное и общее DSLs.
Выполните одно из DSLs в экспериментальном режиме, нажав клавишу F5 или CTRL+F5.
В проекте отладки в экспериментальном экземпляре Visual Studioдобавьте файлы, которые являются экземплярами каждого DSL.
Примечание Visual Studio ModelBus может только разрешения ссылок на элементы модели, которые в одном Visual Studio решение.Например, нельзя создать ссылку на файл модели в другой части файловой системы.
Создайте некоторые элементы и связи в экземпляре, предоставляемого DSL, и сохраните его.
Откройте экземпляр с помощью DSL и выберите элемент модели, имеющий свойство модели ссылки шины.
В окне свойств дважды щелкните свойство модели ссылки шины.Будет открыто диалоговое окно выбора.
Нажать Обзор и выберите экземпляр, предоставляемого DSL.
Выбор препятствовал будет также можно выбрать элемент в модели, если указан тип элемента ссылки шины модели.
Создание ссылок в программном коде
Если необходимо хранить ссылку на модель или элемент в модели можно создать a ModelBusReference.2 Типа ModelBusReference. ссылки и ссылки элемента модели.
Чтобы создать ссылку на модель, необходимо AdapterManager DSL, что модель экземпляра и имени файла или Visual Studio элемент проекта модели.
Чтобы создать ссылку элемента потребуется адаптер для файла модели, и ссылаться на нужный элемент.
Примечание |
---|
с Visual Studio ModelBus, можно создать ссылки только к элементам в этих же Visual Studio решение. |
Импортировать, предоставляемые сборки DSL
Использование в проекте добавьте ссылки проекта на DSL и сборки ModelBusAdapter, предоставляемого DSL.
Например, предположим, что необходимо хранить ссылки ModelBus в элементах MusicLibrary DSL.Ссылка ModelBus сошлются к элементам FamilyTree DSL.в Dsl проект решения MusicLibrary в узле ссылки, добавьте ссылки на следующие сборки:
Fabrikam.FamilyTree.Dsl.dll - предоставленный DSL.
Fabrikam.FamilyTree.ModelBusAdapters.dll - адаптер ModelBus, предоставляемого DSL.
Microsoft.VisualStudio.Modeling.Sdk.Integration.11.0
Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell.11.0
Эти сборки можно найти в ModelBusAdapters проект, предоставляемого DSL, вниз bin\*.
В файле кода, где создании ссылки, обычно нужно импортировать эти пространства имен:
// 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;
...
Создание ссылки на модели
Для создания модели ссылку, доступ к AdapterManager, предоставляемого DSL и использовать его для создания ссылки на модели.Можно указывать либо путь к файлу или a EnvDTE.ProjectItem.
Из AdapterManager, можно получить адаптер, который предоставляет доступ к отдельным элементам в модели.
Примечание |
---|
Необходимо удалить адаптер после завершения с ним.Самый удобный способ добиться этого с a using выписка.Это показано в приведенном ниже примере. |
// 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
Если требуется возможность использования modelReference далее можно сохранить его в свойстве домена, имеющую внешний вид ModelBusReference.
using Transaction t = this.Store.TransactionManager
.BeginTransaction("keep reference"))
{
artist.FamilyTreeReference = modelReference;
t.Commit();
}
Чтобы разрешить пользователям редактировать это свойство, воспользуйтесь домена ModelReferenceEditor в качестве параметра атрибута редактора.Дополнительные сведения см. в разделе Разрешить пользователю изменить ссылку.
Создание ссылки на элемент
Адаптер, созданный для модели можно использовать для создания и включение ссылок.
// person is an element in the FamilyTree model:
ModelBusReference personReference =
adapter.GetElementReference(person);
Если требуется возможность использования elementReference далее можно сохранить его в свойстве домена, имеющую внешний вид ModelBusReference.Чтобы предоставить пользователям, чтобы изменить его, воспользуйтесь ModelElementReferenceEditor в качестве параметра атрибута редактора.Дополнительные сведения см. в разделе Разрешить пользователю изменить ссылку.
Разрешения ссылок
При наличии a ModelBusReference (MBR) можно получить модель или элемент модели, на которые он ссылается.Если элемент на схеме или в другом представлении, можно открыть представление и выбрать элемент.
Можно создать адаптер из MBR.От адаптера, можно получить корневой элемент модели.Можно также разрешить MBR, которые относятся к конкретным элементам внутри модели.
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.
Включение ссылок ModelBus в текстовом шаблоне
DSL необходимо получить доступ, должен иметь адаптер ModelBus, который был настроен для доступа с текстовыми шаблонами.Дополнительные сведения см. в разделе To provide access to a DSL.
Обычно вы будете обращаться к целевой объект DSL с помощью шины модели ссылку (MBR), сохраненных в источнике DSL.Шаблон поэтому включает директиву источника DSL, а также код, чтобы разрешить MBR.Дополнительные сведения о текстовых шаблонах см. в разделе Создание кода из доменного языка.
<#@ 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 a 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 #>]] <# } #>
Дополнительные сведения и пошагового руководства см. в разделе Использование Visual Studio ModelBus в текстовом шаблоне
Сериализация ModelBusReference
Если необходимо хранить a ModelBusReference (MBR) в форме строки можно сериализовать его.
string serialized = modelBus.SerializeReference(elementReference);
// Store it anywhere, then get it back again:
ModelBusReference elementReferenceRestored =
modelBus.DeserializeReference(serialized, null);
MBR, которое сериализуется, таким образом, не зависит от контекста.При использовании простой адаптеры шины модели на основе файлов, то MBR содержит абсолютный путь к файлу.Это достаточно, если файлы моделей экземпляра никогда не будут перемещены.Однако файлы обычно становятся элементами в модели a Visual Studio этот проект.Пользователям возможность перемещения проекта предполагают всего к различным частям файловой системы.Они также предполагают иметь возможность хранения проекта в системе управления версиями и открыв его на разных компьютерах.Поэтому имена пути должны быть сериализованы относительно расположения проекта, содержащего файлы.
Сериализация относительно указанного пути файла
A ModelBusReference содержит a ReferenceContextсловарь, в котором можно хранить информацию, как путь к файлу по отношению к которому оно должно быть сериализовано.
Сериализация относительно пути:
elementReference.ReferenceContext.Add(
ModelBusReferencePropertySerializer.FilePathSaveContextKey,
currentProjectFilePath);
string serialized = modelBus.SerializeReference(elementReference);
Извлечь ссылку из строки:
ReferenceContext context = new ReferenceContext();
context.Add(ModelBusReferencePropertySerializer.FilePathLoadContextKey,
currentProjectFilePath);
ModelBusReference elementReferenceRestored =
modelBus.DeserializeReference(serialized, context);
ModelBusReferences, созданных другими адаптерами
Следующие сведения полезны, если требуется создать собственный адаптер.
A ModelBusReference (MBR) состоит из 2 частей: заголовок MBR, который десериализуется моделей шиной и адаптер-специфический, обрабатываемого конкретным диспетчером адаптера.Это позволяет обеспечить собственный формат сериализации адаптера.Например, можно ссылаться на эту базу данных, а не файл или можно хранить дополнительную информацию в ссылке адаптера.Собственный адаптер может установить дополнительную информацию в ReferenceContext.
При десериализации MBR, необходимо предоставить ReferenceContext, которая затем сохраняется в объекте MBR.При сериализации MBR, хранящиеся ReferenceContext используется адаптером, помогающие создавать строку.Десериализованный строка не содержит все сведения в ReferenceContext.Например, в простом на основе файле адаптере, ReferenceContext содержит путь к файлу adapter, в котором не хранится в сериализованной строки MBR.
MBR десериализуется в 2 этапа:
ModelBusReferencePropertySerializer стандартный сериализатор, который имеет дело с заголовком MBR.Он использует стандартный DSL SerializationContext контейнер свойств, который хранится в ReferenceContext с помощью ключа ModelBusReferencePropertySerializer.ModelBusLoadContextKey.в частности, SerializationContext содержаться экземпляр ModelBus.
Адаптер ModelBus имеет дело с частью MBR специфичное для адаптера.Он может использовать дополнительные данные, хранящиеся в ReferenceContext MBR.Простой на основе файлов адаптер содержит пути к файлам с помощью корневые ключи FilePathLoadContextKeyи FilePathSaveContextKey.
Ссылка адаптера в модели файле десериализуются только тогда, когда она используется.
Создание модели
Создание, открытие и изменение модели
Следующий фрагмент кода взят из образца конечного автомата на веб-сайте VMSDK.Он иллюстрирует использование ModelBusReferences создать и открыть модель и получить схему, связанную с моделью.
В этом образце имя целевого объекта DSL StateMachine.Несколько имен являются производными от него, такие как имя модели и имя класса ModelBusAdapter.
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();
}
}
Проверить ссылки
BrokenReferenceDetector проверяет все свойства в хранилище, который может содержать ModelBusReferences.Он вызывает действие, которое предоставляет собой где любое действие найдена.Это особенно полезно для методов проверки.Следующий метод проверки проверяет хранилище на попытке сохранить модель и broken отчетами ссылки в окне ошибок:
[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 ths ReferenceState instance "
+ "named '{1}' contains reference value '{2}' which is invalid";
Действия, выполняемые расширением ModelBus
Следующие данные не требуются, но может оказаться полезным при внесении обширную использование ModelBus.
Расширение ModelBus вносит следующие изменения в решении DSL.
Если щелкнуть правой кнопкой мыши схему определения DSL, кнопки Включите Modelbus, а затем выберите Разрешить этот DSL, чтобы использовать ModelBus.
В проекте DSL, ссылка будет добавлена к Microsoft.VisualStudio.Modeling.Sdk.Integration.11.0.dll
В определении DSL, добавляется внешняя ссылка типа: Microsoft.VisualStudio.Modeling.Integration.ModelBusReference.
Можно видеть ссылку in Обозреватель DSLв области Типы домена.Добавление внешних ссылок типа вручную, щелкните правой кнопкой мыши корневой узел.
Добавлен новый файл шаблона, Dsl\GeneratedCode\ModelBusReferencesSerialization.tt.
Если нужно задать тип свойства домена к ModelBusReference, а затем щелкните правой кнопкой мыши свойство и выберите Включить конкретные свойства ModelBusReference.
Несколько атрибутов среды CLR добавлены к свойству домена.Можно просмотреть их в поле настраиваемых атрибутов в окне свойства.IN Dsl\GeneratedCode\DomainClasses.csможно просмотреть атрибуты в объявлении свойства:
[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, кнопки Включите Modelbusи выберите Предоставьте этот DSL к ModelBus.
Новый проект ModelBusAdapter добавить в решение.
Ссылка на ModelBusAdapter добавляет к DslPackage этот проект.ModelBusAdapter содержит ссылку к Dsl этот проект.
IN DslPackage\source.extention.tt" |ModelBusAdapter| добавляет как компонент MEF.
См. также
Основные понятия
Практическое руководство. Открытие модели из файла в коде программы
Практическое руководство. Интеграция моделей UML с другими моделями и средствами
Практическое руководство. Добавление обработчика перетаскивания