使用 Visual Studio Modelbus 整合模型
Visual StudioModelBus 提供方法,以建立模型間來回的其他工具的連結到模型。 比方說,就可以連線定義域專屬語言 (DSL) 模型以及 UML 模型。 您可以建立一組整合的 Dsl。
ModelBus 可讓您建立特別的參考到模型或模型內的特定項目。 這個參考可以儲存超出該模型,比方說,在另一個模型中的項目。 當您在較新的情況下,一種工具想要取得項目的存取權時,將載入適當的模型模型匯流排基礎結構,並將其傳回的項目。 如果您想要的選項,您可以向使用者顯示的模型。 如果無法存取檔案,先前的位置中,ModelBus 會要求使用者尋找它。 如果使用者發現的檔案,ModelBus 會修復該檔案的所有參考。
注意事項 |
---|
在 [目前的Visual Studio ModelBus,連結模型的實作必須在同一個項目Visual Studio的解決方案。 |
如需詳細資訊和範例程式碼,請參閱:
Visual Studio 視覺化和模型的 SDK (VMSDK) 的 Web 站台
提供存取的 DSL
您可以建立模型或其元素的 ModelBus 參照之前,您就必須定義 ModelBusAdapter 的 DSL。 若要這麼做最簡單的方法是使用Visual Studio模型匯流排副檔名,將命令加入 DSL 設計工具。
若要公開 (expose) 至模型匯流排的 DSL 定義
下載並安裝 Visual Studio 模型匯流排擴充,除非您已經安裝它。 如需詳細資訊,請參閱視覺化和模型的 SDK。
開啟 DSL 的定義檔。 在設計介面上按一下滑鼠右鍵,然後按一下 [ 啟用 Modelbus。
在對話方塊中,選擇我想要公開 (expose) 這個 DSL 而將 ModelBus。 如果您想要公開 (expose) 其模型和使用其他 Dsl 參考這個 DSL 的情況下,可以選擇這兩個選項。
按一下 [確定]。 "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 文字範本和與其他程式碼,您需要兩張介面卡,分別修改和未經修改。
按一下 [ 轉換所有範本。
重建方案。
現在您就可以為 ModelBus 開啟本 DSL 的執行個體。
資料夾ModelBusAdapters\bin\*包含所建置的組件Dsl專案以及ModelBusAdapters專案。 若要從其他 DSL 參考這個 DSL,您應該在匯入這些組件。
並確認其項目可以被參考
Visual StudioModelBus 介面卡使用項目的 guid 來識別它,預設情況下。 因此,這些識別項必須保存在模型檔案。
若要確保該項目被永久性的識別碼
開啟 [DslDefinition.dsl]。
在 DSL 總管] 中,展開 Xml 序列化行為,然後 類別資料。
您要建立模型匯流排的每個類別的參考:
按一下 [類別] 節點,並在 [屬性] 視窗中,確認序列化識別碼設定為 true。
或者,如果您想要使用的項目名稱來識別項目,而不是 guid,您可以覆寫產生的配接器的組件。 覆寫下列方法在配接器類別:
覆寫GetElementId傳回您想要使用的識別項。 建立參考時,會呼叫這個方法。
覆寫ResolveElementReference找不到正確的項目從模型匯流排參考。
從其他 DSL 存取 DSL
您可以將模型匯流排參考儲存在網域中的屬性 DSL,而且您可以撰寫自訂程式碼,使用它們。 您也可以讓使用者挑選模型檔案,並在其中的項目,以建立模型匯流排參考。
若要啟用 DSL 而將使用其他 DSL 參考,您應該先讓它消費者的模型匯流排參考。
若要啟用 DSL 而將使用公開的 DSL 的參考
在 DSL 定義圖表中,以滑鼠右鍵按一下圖表的主要部分,然後按一下啟用 Modelbus。
在對話方塊中,選取 [ 我要啟用這種模型使用模型匯流排參考。
將在使用 DSL 的 Dsl 專案中,下列組件參考加入至專案。 在 「 公開 」 DSL ModelBusAdapter\bin\ * 目錄中,您會發現這些組件 (.dll 檔案)。
公開的 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 參考編輯器的屬性。 有兩個版本,這個編輯器或選擇器: 一個可讓使用者選擇模型檔案中,以及其他可讓使用者選擇模型檔案,並在模型中的項目。
若要允許使用者在 [網域] 屬性設定模型匯流排參考
以滑鼠右鍵按一下 [網域] 屬性,然後按一下 特定屬性的編輯 ModelBusReference。 對話方塊隨即開啟。 這是模型匯流排選擇器。
選取適當的的 ModelBusReference: 一種模型或模型內的項目。
在 [檔案] 對話方塊的篩選條件字串,請輸入字串,例如Family Tree files |*.ftree。 Subsitute 您的公開 DSL 的副檔名。
如果您選擇要參考到模型中的項目,您可以新增型別的清單,使用者可以選取,例如 Company.FamilyTree.Person。
按一下 [確定],然後按一下 轉換所有的範本在 [方案總管] 工具列中。
警告
如果您尚未選取有效的模型或實體,[確定] 按鈕必須沒有作用,即使它可能會顯示已啟用。
如果您指定的目標型別,例如 Company.FamilyTree.Person 清單時,您必須新增組件參考至您的 DSL 專案參考該 DLL 的目標 DSL,例如 Company.FamilyTree.Dsl.dll
若要測試模型匯流排參考
建立公開及取用的 Dsl。
執行其中一個 Dsl 實驗性質的模式,請按 F5 或 CTRL + F5。
在 [偵錯專案中,實驗性質的執行個體的Visual Studio,新增每一個 DSL 的執行個體的檔案。
注意事項 Visual StudioModelBus 可以只參考解析為模型,是在同一個項目Visual Studio的解決方案。比方說,您無法建立模型檔的參考,您的檔案系統的其他部分。
建立公開的 DSL 執行個體中的某些項目和連結,並將它儲存。
開啟使用 DSL 的執行個體,並選取模型匯流排參考屬性的模型項目。
在 [屬性] 視窗中,連按兩下的模型匯流排參考] 屬性。 選擇器] 對話方塊隨即開啟。
按一下 [ 瀏覽 ,然後選取 [公開 DSL 的執行個體。
選擇器也可以選擇一個項目在模型中,如果您所指定模型匯流排參考的項目特定種類。
建立程式碼中的參考
當您想要儲存參考的模型或模型內的項目時,建立ModelBusReference。 有兩種類型的ModelBusReference: 建立參考和項目參考的模型。
若要建立模型的參考,您需要的 DSL 模型是執行個體,且檔名的 AdapterManager 或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,並用它來建立模型的參考。 您可以指定任何檔案的路徑,或EnvDTE.ProjectItem。
從 AdapterManager 中,您可以取得介面卡,它提供了存取模型中的個別項目。
注意事項 |
---|
完成後使用它,您必須處置配接器。若要這麼做最方便的方法是使用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中的編輯屬性參數。 如需詳細資訊,請參閱允許使用者編輯參考。
在解析參考
如果您有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
如果您想要儲存ModelBusReference (MBR) 在表單中的字串,您可以將它序列化:
string serialized = modelBus.SerializeReference(elementReference);
// Store it anywhere, then get it back again:
ModelBusReference elementReferenceRestored =
modelBus.DeserializeReference(serialized, null);
如此一來會序列化 MBR 與內容無關。 如果您正在使用簡單的檔案架構模型匯流排介面卡,「 MBR 」 包含絕對檔案路徑。 這便足以表達例項的模型檔將不會移動。 不過,模型檔通常還會在項目Visual Studio專案。 您的使用者會預期要能夠移動整個專案的檔案系統的不同部分。 將也會希望能夠保留原始檔控制之下的專案,並在不同的電腦上開啟。 因此,路徑名稱應序列化相對於專案檔案所在的位置。
序列化指定的檔案路徑的相對
A ModelBusReference包含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) 是由兩個部分所組成: MBR 標頭,模型匯流排還原序列化時,而且由特定的配接器管理員 」 處理配接器特定。 這可以讓您提供您自己的介面卡的序列化格式。 比方說,您便可以同時參考的資料庫,而不是一個檔案,或者您可以將額外的資訊儲存在配接器的參考。 您自己的配接器可以放置在所需的詳細資訊ReferenceContext。
當您還原序列化有 MBR 時,則您必須提供的 ReferenceContext,然後儲存在 MBR 物件。 當您序列化有 MBR 時,預存的 ReferenceContext 使用配接器,協助產生的字串。 已還原序列化的字串不包含在 ReferenceContext 中的所有資訊。 比方說,在簡單的 「 檔案為基礎介面卡 」,ReferenceContext 會包含根目錄的檔案路徑,而不會儲存在已序列化的 MBR 字串。
MBR 會還原序列化,以兩個階段:
ModelBusReferencePropertySerializer是標準的序列化程式處理 MBR 標頭包含進來。 它會使用標準的 DSL SerializationContext屬性包,儲存在ReferenceContext使用金鑰ModelBusReferencePropertySerializer.ModelBusLoadContextKey。 特別是, SerializationContext應該包含的執行個體ModelBus。
您的 ModelBus 介面卡處理配接器特有的一部分 MBR。 它可以使用儲存在 MBR 的 ReferenceContext 中的其他資訊。 簡單檔案為基礎的配接器會使用金鑰的根檔案路徑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 的存放區中的所有網域的內容。 它呼叫的動作,您可以找到的任何動作。 這特別適用於驗證的方法。 下列的驗證方法會測試嘗試儲存模型中,存放區,並報告中斷的參照,在錯誤視窗中:
[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。
您所見的參考,在 DSL 總管的 網域類型。 若要以手動方式新增外部的型別參考,以滑鼠右鍵按一下根節點。
新增新的範本檔案時, Dsl\GeneratedCode\ModelBusReferencesSerialization.tt。
當您將網域屬性的型別設定為 ModelBusReference,然後以滑鼠右鍵按一下該屬性並按一下啟用 ModelBusReference 的特定屬性:
有數個 CLR 屬性會加入至 [網域] 屬性。 您可以在 [屬性] 視窗中的 [自訂屬性] 欄位中看到它們。 在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,然後選取 公開 (expose) 這個 DSL 而將 ModelBus:
新的專案ModelBusAdapter加入至方案。
參考ModelBusAdapter加入至DslPackage專案。 ModelBusAdapter參考Dsl專案。
在DslPackage\source.extention.tt, |ModelBusAdapter|會被加入成為 MEF 的元件。