Visual Studio Modelbus를 사용하여 모델 통합
Visual Studio ModelBus에서 모델 간의 링크와 다른 도구에서 모델로의 링크를 만드는 방법을 제공합니다. 예를 들어 DSL(도메인별 언어) 모델 및 UML 모델을 연결할 수 있습니다. 통합 DSL 집합을 만들 수 있습니다.
Warning
이 문서에 설명된 Visual Studio ModelBus 확장은 더 이상 다운로드할 수 없습니다. 그러나 이러한 지침은 이 확장이 이미 설치된 사용자에게 여전히 적용됩니다.
ModelBus에서는 모델 또는 모델 내의 특정 요소에 대한 고유 참조를 만들 수 있습니다. 이 참조는 다른 모델의 요소 등 모델 외부에 저장할 수 있습니다. 나중에 도구에서 요소에 액세스해야 하면 ModelBus 인프라에서 적절한 모델을 로드하고 요소를 반환합니다. 원하는 경우 사용자에게 모델을 표시할 수 있습니다. 이전 위치에서 파일에 액세스할 수 없으면 ModelBus에서 사용자에게 파일을 찾으라는 메시지를 표시합니다. 사용자가 파일을 찾으면 해당 파일에 대한 모든 참조를 업데이트합니다.
참고 항목
ModelBus의 현재 Visual Studio 구현에서는 연결된 모델이 동일한 Visual Studio 솔루션에 있는 항목이어야 합니다.
ModelBus Extension에 대한 자세한 내용은 다음 리소스를 참조하세요.
참고 항목
텍스트 템플릿 변환 구성 요소는 Visual Studio 확장 개발 워크로드의 일부로 자동으로 설치됩니다. Visual Studio 설치 프로그램의 개별 구성 요소 탭, SDK, 라이브러리, 프레임워크 범주 아래에서 설치할 수도 있습니다. 개별 구성 요소 탭에서 Modeling SDK 구성 요소를 설치합니다.
DSL에 대한 액세스 제공
모델이나 모델의 요소에 대한 ModelBus 참조를 만들려면 DSL에 대해 ModelBusAdapter를 정의해야 합니다. 가장 쉽게 정의하는 방법은 Visual Studio Model Bus Extension을 사용하는 것입니다. 이 확장은 DSL 디자이너에 명령을 추가합니다.
ModelBus에 DSL 정의를 노출하려면
DSL 정의 파일을 엽니다. 디자인 화면을 마우스 오른쪽 단추로 클릭하고 ModelBus 사용을 선택합니다.
대화에서 ModelBus에 이 DSL 표시를 선택합니다. 이 DSL을 모델에 표시하는 동시에 다른 DSL에 대한 참조도 사용하려는 경우 두 옵션을 모두 선택하면 됩니다.
확인을 선택합니다. 새 프로젝트(
ModelBusAdapter
)가 DSL 솔루션에 추가됩니다.텍스트 템플릿에서 DSL에 액세스하려면 새 프로젝트에서 AdapterManager.tt를 수정해야 합니다. 명령 및 이벤트 처리기와 같은 기타 코드에서 DSL에 액세스하려면 이 단계를 생략합니다. 자세한 내용은 텍스트 템플릿에서 Visual Studio ModelBus 사용을 참조하세요.
AdapterManagerBase
의 기본 클래스를 VsTextTemplatingModelingAdapterManager로 변경합니다.파일 끝부분의 클래스
AdapterManager
앞에 다음 특성을 삽입합니다.[Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]
ModelBusAdapter
프로젝트의 NuGet 패키지 관리자에서 NuGet PackageReference를Microsoft.VisualStudio.TextTemplating.Modeling
에 추가합니다.텍스트 템플릿과 기타 코드에서 모두 DSL에 액세스하려면 어댑터 두 개(수정된 어댑터와 수정되지 않은 어댑터)가 필요합니다.
모든 템플릿 변환을 선택합니다.
솔루션을 다시 빌드합니다.
ModelBus는 이제 이 DSL의 인스턴스를 열 수 있습니다.
ModelBusAdapters\bin* 폴더에는
Dsl
프로젝트와ModelBusAdapters
프로젝트에서 빌드한 어셈블리가 포함되어 있습니다. 다른 DSL에서 이 DSL을 참조하려면 이러한 어셈블리를 가져옵니다.
요소를 참조할 수 있는지 확인
기본적으로 Visual Studio ModelBus 어댑터는 요소의 GUID를 사용하여 식별합니다. 이러한 식별자는 모델 파일에 지속되어야 합니다.
요소 ID가 영구적으로 저장되었는지 확인하려면 다음을 수행합니다.
DslDefinition. dsl을 엽니다.
DSL 탐색기에서 Xml 직렬화 동작과 클래스 데이터를 순서대로 확장합니다.
ModelBus 참조를 만들 각 클래스에 대해 다음 작업을 수행합니다.
클래스 노드를 선택하고 속성 창에서 ID 직렬화가
true
로 설정되어 있는지 확인합니다.
또는 GUID가 아닌 요소 이름을 사용하여 요소를 식별하려는 경우에는 생성된 어댑터 부분을 재정의할 수 있습니다. 어댑터 클래스에서 다음 메서드를 재정의합니다.
- 사용하려는 식별자를 반환하도록
GetElementId
를 재정의합니다. 참조를 만들 때 이 메서드를 호출합니다. - ModelBus 참조에서 올바른 요소를 찾도록
ResolveElementReference
를 재정의합니다.
다른 DSL에서 DSL에 액세스
DSL의 도메인 속성에 ModelBus 참조를 저장할 수 있으며 해당 참조를 사용하는 사용자 지정 코드를 작성할 수 있습니다. 사용자가 모델 파일과 파일 내의 요소를 선택하여 ModelBus 참조를 만들도록 할 수도 있습니다.
DSL이 다른 DSL에 대한 참조를 사용하도록 설정하려면 먼저 해당 DSL을 ModelBus 참조의 ‘소비자’로 지정해야 합니다.
DSL이 표시된 DSL에 대한 참조를 사용하도록 설정하려면
DSL 정의 다이어그램에서 다이어그램의 주요 부분을 마우스 오른쪽 단추로 클릭한 다음 ModelBus 사용을 선택합니다.
대화에서 이 모델이 ModelBus 참조를 사용하도록 설정을 선택합니다.
사용 DSL의
Dsl
프로젝트에서 프로젝트 참조에 다음 어셈블리를 추가합니다. 이러한 어셈블리(.dll 파일)는 노출된 DSL의 ModelBusAdapter\bin\* 디렉터리에 있습니다.표시되는 DSL 어셈블리(예: Fabrikam.FamilyTree.Dsl.dll)
표시되는 모델 버스 어댑터 어셈블리(예: Fabrikam.FamilyTree.ModelBusAdapter.dll)
참조를 사용하는 DSL 프로젝트의 프로젝트 참조에 다음 .NET 어셈블리를 추가합니다.
- Microsoft.VisualStudio.Modeling.Sdk.Integration.dll
- Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell.dll
도메인 속성에 ModelBusReference를 저장하려면
참조를 사용하는 DSL의 DSL 정의에서 도메인 클래스에 도메인 속성을 추가하고 해당 이름을 설정합니다.
속성 창에서 도메인 속성을 선택한 상태에서 형식을
ModelBusReference
로 설정합니다.이 단계에서 프로그램 코드는 속성 값을 설정할 수 있습니다. 값은 속성 창에서 읽기 전용입니다.
사용자가 특수 ModelBusReference 편집기를 사용하여 속성을 설정하도록 허용할 수 있습니다. 이 편집기 또는 선택기에는 두 가지 버전이 있습니다. 하나는 사용자가 모델 파일을 선택할 수 있도록 하고 다른 하나는 사용자가 모델 내에서 모델 파일과 요소를 선택할 수 있도록 합니다.
사용자가 도메인 속성에서 ModelBusReference를 설정할 수 있도록 하려면
도메인 속성을 마우스 오른쪽 단추로 클릭하고 ModelBusReference 관련 속성 편집을 선택합니다. Model Bus 선택기 대화 상자가 열립니다.
적절한 ModelBusReference 종류를 모델 또는 모델 내부의 요소로 설정합니다.
파일 대화 상자의 필터 문자열에
Family Tree files |*.ftree
등의 문자열을 입력합니다. 표시된 DSL의 파일 확장명을 바꿉니다.모델의 요소를 참조하도록 선택한 경우 사용자가 선택할 수 있는 유형 목록을 추가할 수 있습니다(예:
Company.FamilyTree.Person
).확인을 선택하고 솔루션 탐색기 도구 모음에서 모든 템플릿 변환을 선택합니다.
Warning
올바른 모델이나 엔터티를 선택하지 않은 경우 확인 단추가 사용 가능한 것처럼 표시될 수 있지만 클릭해도 아무런 변화가 없습니다.
Company.FamilyTree.Person
과 같은 대상 형식 목록을 지정한 경우 대상 DSL의 DLL을 참조하여 DSL 프로젝트에 어셈블리 참조를 추가해야 합니다(예: Company.FamilyTree.Dsl.dll).
ModelBusReference를 테스트하려면
표시되는 SDL과 참조를 사용하는 DSL을 모두 작성합니다.
F5 또는 CTRL+F5를 눌러 실험 모드에서 DSL 중 하나를 실행합니다.
디버깅 프로젝트의 Visual Studio 실험 인스턴스에서 각 DSL의 인스턴스인 파일을 추가합니다.
참고 항목
Visual Studio ModelBus는 동일한 Visual Studio 솔루션에 있는 항목인 모델에 대한 참조만 확인할 수 있습니다. 예를 들어 파일 시스템의 다른 부분에 있는 모델 파일에 대한 참조를 만들 수는 없습니다.
표시되는 DSL의 인스턴스에서 요소와 링크를 몇 개 만들고 해당 DSL을 저장합니다.
참조를 사용하는 DSL의 인스턴스를 열고 ModelBus 참조 속성이 포함된 모델 요소를 선택합니다.
속성 창에서 모델 버스 참조 속성을 두 번 클릭합니다. 선택 대화 상자가 열립니다.
찾아보기를 클릭하고 표시되는 DSL 인스턴스를 선택합니다.
요소별 모델 버스 참조를 지정한 경우 선택기를 사용하여 모델에서 항목을 선택할 수도 있습니다.
프로그램 코드에서 참조 만들기
모델 또는 모델 내 요소에 대한 참조를 저장하려면 ModelBusReference
를 만듭니다. ModelBusReference
에는 모델 참조와 요소 참조의 두 가지 종류가 있습니다.
모델 참조를 만들려면 모델이 인스턴스인 DSL의 AdapterManager와 모델의 파일 이름 또는 Visual Studio 프로젝트 항목이 필요합니다.
요소 참조를 만들려면 모델 파일의 어댑터와 참조할 요소가 필요합니다.
참고 항목
Visual Studio ModelBus를 사용하여 동일한 Visual Studio 솔루션에 있는 항목에 대한 참조만 만들 수 있습니다.
표시되는 DSL 어셈블리 가져오기
사용 프로젝트에서 DSL 및 표시되는 DSL의 ModelBusAdapter
어셈블리에 대한 프로젝트 참조를 추가합니다.
MusicLibrary DSL의 요소에 ModelBus 참조를 저장하려는 경우를 예로 들어 보겠습니다. 여기서 ModelBus 참조는 FamilyTree DSL의 요소를 참조합니다. References 노드에서 MusicLibrary 솔루션의 Dsl
프로젝트에서 다음 어셈블리에 대한 참조를 추가합니다.
Fabrikam.FamilyTree.Dsl.dll. 표시된 DSL입니다.
Fabrikam.FamilyTree.ModelBusAdapters.dll 표시되는 DSL의 ModelBus 어댑터입니다.
Microsoft.VisualStudio.Modeling.Sdk.Integration
Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell
이러한 어셈블리는 *bin\** 아래에 있는 표시된 DSL의
ModelBusAdapters
프로젝트에서 찾을 수 있습니다.참조를 만드는 코드 파일에서 일반적으로 다음 네임스페이스를 가져와야 합니다.
// 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;
...
모델에 대한 참조를 만들려면
모델 참조를 만들려면 표시되는 DSL의 AdapterManager에 액세스한 다음 AdapterManager를 사용하여 모델에 대한 참조를 만듭니다. 파일 경로나 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
를 Editor
특성의 매개 변수로 사용합니다. 자세한 내용은 사용자가 참조를 편집하도록 허용을 참조하세요.
요소에 대한 참조를 만들려면
모델용으로 만든 어댑터를 사용하여 참조를 만들고 확인할 수 있습니다.
// person is an element in the FamilyTree model:
ModelBusReference personReference =
adapter.GetElementReference(person);
나중에 elementReference
를 사용하려는 경우 외부 형식이 ModelBusReference
인 도메인 속성에 저장하면 됩니다. 사용자가 편집할 수 있도록 하려면 Editor
특성의 매개 변수로 ModelElementReferenceEditor
를 사용합니다. 자세한 내용은 사용자가 참조를 편집하도록 허용을 참조하세요.
참조 확인
MBR(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.
텍스트 템플릿에서 ModelBusReferences를 확인하려면
액세스하려는 DSL에는 텍스트 템플릿이 액세스하도록 구성된 ModelBus 어댑터가 있어야 합니다. 자세한 내용은 DSL에 대한 액세스 권한 제공을 참조하세요.
일반적으로는 소스 DSL에 저장된 MBR(ModelBus 참조)을 사용하여 대상 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 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 #>]]
<#
}
#>
자세한 내용과 연습은 텍스트 템플릿에서 Visual Studio ModelBus 사용을 참조하세요.
ModelBusReference 직렬화
문자열 형식으로 MBR(ModelBusReference
)을 저장하려는 경우 MBR을 serialize하면 됩니다.
string serialized = modelBus.SerializeReference(elementReference);
// Store it anywhere, then get it back again:
ModelBusReference elementReferenceRestored =
modelBus.DeserializeReference(serialized, null);
이러한 방식으로 직렬화되는 MBR은 컨텍스트의 영향을 받지 않습니다. 단순 파일 기반 모델 버스 어댑터를 사용하는 경우 MBR에는 절대 파일 경로가 포함됩니다. 인스턴스 모델 파일이 이동하지 않으면 이 serialization으로 충분합니다. 그러나 모델 파일은 일반적으로 Visual Studio 프로젝트의 항목입니다. 사용자는 전체 프로젝트를 파일 시스템의 다른 부분으로 이동할 수 있어야 합니다. 또한 프로젝트의 소스를 제어하고 다른 컴퓨터에서 프로젝트를 열 수 있어야 합니다. 그러므로 파일이 포함된 프로젝트의 위치를 기준으로 하여 경로 이름을 serialize해야 합니다.
지정된 파일 경로를 기준으로 직렬화
ModelBusReference
는 참조를 serialize할 기준이 되는 파일 경로 등의 정보를 저장할 수 있는 사전인 ReferenceContext
를 포함합니다.
특정 경로를 기준으로 serialize하려면 다음 코드를 사용합니다.
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);
다른 어댑터에서 만든 ModelBus 참조
어댑터를 직접 만들려는 경우에는 다음 정보가 유용합니다.
MBR(ModelBusReference
)은 두 부분으로 구성되는데, 그 중 하나는 ModelBus를 통해 역직렬화되는 MBR 헤더이고 다른 하나는 특정 어댑터 관리자를 통해 처리되는 어댑터 관련 부분입니다. 이 접근 방식을 사용하면 어댑터 serialization 형식을 직접 제공할 수 있습니다. 예를 들어 파일이 아닌 데이터베이스를 참조하거나 어댑터 참조에 추가 정보를 저장할 수 있습니다. 고유한 어댑터를 사용하는 경우 ReferenceContext
에 추가 정보가 저장될 수 있습니다.
MBR을 역직렬화할 때는 ReferenceContext를 제공해야 합니다. 이 ReferenceContext는 MBR 개체에 저장됩니다. MBR을 serialize할 때 어댑터는 저장된 ReferenceContext를 사용하여 문자열을 생성합니다. 역직렬화된 문자열에 ReferenceContext의 모든 정보가 포함되는 것은 아닙니다. 예를 들어, 단순 파일 기반 어댑터에서 ReferenceContext는 루트 파일 경로를 포함합니다. 경로는 직렬화된 MBR 문자열에 저장되지 않습니다.
MBR은 두 단계로 역직렬화됩니다.
ModelBusReferencePropertySerializer
는 MBR 헤더를 처리하는 표준 직렬 변환기입니다. 이 항목은SerializationContext
키를 사용하여ReferenceContext
에 저장되는 표준 DSLModelBusReferencePropertySerializer.ModelBusLoadContextKey
속성 모음을 사용합니다. 특히SerializationContext
는ModelBus
인스턴스를 포함해야 합니다.ModelBus 어댑터는 MBR의 어댑터 관련 부분을 처리하며 MBR의 ReferenceContext에 저장된 추가 정보를 사용할 수 있습니다. 단순 파일 기반 어댑터는
FilePathLoadContextKey
및FilePathSaveContextKey
키를 사용하여 루트 파일 경로를 저장합니다.모델 파일의 어댑터 참조는 사용할 때만 역직렬화됩니다.
모델 만들기
모델 만들기, 열기, 편집
다음 코드 조각은 VMSDK 웹 사이트의 상태 시스템 샘플에서 가져온 것으로, ModelBusReference를 사용해 모델을 만들고 여는 방법과 모델에 연결된 다이어그램을 가져오는 방법을 보여줍니다.
이 샘플에서 대상 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는 ModelBusReference를 포함할 수 있는 저장소 내의 모든 도메인 속성을 테스트하며, 작업이 발견되는 위치를 제공하는 작업을 호출합니다. 이 테스트는 유효성 검사 메서드에 유용합니다. 다음 유효성 검사 메서드는 모델 저장 시도 시 저장소를 테스트하고 손상된 참조를 오류 창에서 보고합니다.
[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 확장이 수행하는 작업
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 활성화를 선택한 다음 이 DSL을 ModelBus에 노출을 선택합니다.
새 프로젝트(
ModelBusAdapter
)가 솔루션에 추가됩니다.ModelBusAdapter
에 대한 참조가DslPackage
프로젝트에 추가됩니다.ModelBusAdapter
에는Dsl
프로젝트에 대한 참조가 있습니다.DslPackage\source.extention.tt에서
|ModelBusAdapter|
는 MEF 구성 요소로 추가됩니다.