Visual Studio Modelbus를 사용하여 모델 통합

Visual StudioModelBus 모델에 다른 도구 및 모델 간의 링크를 만드는 방법을 설명 합니다.예를 들어, UML 모델 및 도메인 관련 언어 (DSL) 모델을 연결할 수 있습니다.Dsl의 통합된 된 집합을 만들 수 있습니다.

ModelBus 고유한 참조 하 여 모델 또는 모델 내의 특정 요소를 만들 수 있습니다.이 참조가 외부 모델, 예를 들어, 다른 모델에서 요소에 저장할 수 있습니다.나중에 경우에, 도구에서 요소에 액세스 하려고 할 때, 모델 버스 인프라 해당 모델을 로드 하 고 해당 요소를 반환 합니다.필요한 경우 사용자에 게 모델을 표시할 수 있습니다.이전 위치에서 파일에 액세스할 수 없는 경우 사용자가 찾을 수 ModelBus 요청 합니다.사용자는 파일을 찾으면 해당 파일에 모든 참조 ModelBus 수정 됩니다.

[!참고]

현재에서 Visual Studio Modelbus에 연결 된 모델의 구현에 동일한 항목 수 Visual Studio 솔루션입니다.

자세한 내용과 코드 예제를 참조 하십시오.

DSL에 대 한 액세스 제공

ModelBus 참조는 모델 또는 요소를 만들 수 있습니다 전에 DSL에 대 한 Modelbusadapter를 정의 해야 합니다.이 작업을 수행 하는 가장 쉬운 방법은 사용 하는 것은 Visual Studio 모델 버스 확장을 DSL 디자이너에 명령을 추가 합니다.

DSL 정의를 버스 모델 노출

  1. 다운로드 하 고 아직 설치 하지 않은 경우 Visual Studio 모델 버스 확장을 설치 합니다.자세한 내용은 시각화 및 모델링 SDK.

  2. DSL 정의 파일을 엽니다.디자인 화면을 마우스 오른쪽 단추로 클릭 하 고 다음을 클릭 사용 Modelbus.

  3. 선택 대화 상자에서 에 노출 하는 Modelbus이이 DSL.이 DSL의 모델을 제공 하 고 다른 Dsl에 대 한 참조를 사용할 경우 두 가지 옵션을 선택할 수 있습니다.

  4. 확인을 클릭합니다.새 프로젝트 "ModelBusAdapter" DSL 솔루션에 추가 됩니다.

  5. DSL 텍스트 템플릿에서 액세스 하려면 새 프로젝트에서 Adaptermanager.tt를 수정 해야 합니다.DSL 명령 및 이벤트 처리기와 같은 다른 코드에 액세스 하는 경우이 단계를 생략 합니다.자세한 내용은 텍스트 템플릿에서 Visual Studio ModelBus 사용를 참조하십시오.

    1. 기본 클래스의 AdapterManagerBase 변경 VsTextTemplatingModelingAdapterManager.

    2. 파일의 끝에 가까이이 추가 특성 클래스 AdapterManager 앞에 삽입 합니다.

      [Microsoft.VisualStudio.Modeling.Integration.HostSpecific(HostName)]

    3. 참조의 ModelBusAdapter 프로젝트에서 추가 Microsoft.VisualStudio.TextTemplating.Modeling.11.0.

    DSL 텍스트 서식 파일에서와 다른 코드에서 액세스할 경우 두 어댑터 수정, 하나 하나 수정 해야 합니다.

  6. 클릭 서식 파일을 모두 변환.

  7. 솔루션을 다시 빌드합니다.

이제 열이 DSL의 인스턴스 수에 대 한 ModelBus 수 있습니다.

폴더 ModelBusAdapters\bin\* 로 빌드된 어셈블리를 포함의 Dsl 프로젝트와 ModelBusAdapters 프로젝트입니다.다른 DSL에서이 DSL이 참조 하려면이 어셈블리를 가져와야 합니다.

Ff519531.collapse_all(ko-kr,VS.110).gif요소를 참조 하지 않도록 합니다.

Visual StudioModelBus 어댑터 guid 요소를 기본적으로를 사용 하십시오.따라서 이러한 식별자는 모델 파일에 지속.

해당 요소 id가 유지 되지 않도록 하려면

  1. Dsldefinition.dsl를 엽니다.

  2. DSL 탐색기 확장 Xml Serialization 동작, 다음 클래스 데이터.

  3. 버스 모델을 만들려는 각 클래스에 대해 참조 합니다.

    클래스 노드를 클릭 하 고 속성 창에서 Serialize Id 으로 설정 true.

또는 요소 guid 대신 식별 요소 이름을 사용할 경우 생성 된 어댑터의 일부를 재정의할 수 있습니다.어댑터 클래스에 다음 메서드를 재정의 합니다.

  • 재정의 GetElementId 를 사용 하는 식별자를 반환 합니다.이 메서드는 참조를 만들 때 호출 됩니다.

  • 재정의 ResolveElementReference 모델 버스에 대 한 참조를 올바른 요소를 찾습니다.

다른 DSL에서 DSL 액세스

버스에 대 한 참조 모델에서 DSL 도메인 속성을 저장할 수 있는 및을 사용 하는 사용자 지정 코드를 작성할 수 있습니다.또한 사용자 모델 버스 참조 모델 파일 및 그 안에 있는 요소를 선택 하 여 만들 수 있습니다.

다른 DSL에 대 한 참조를 사용 하 여 DSL을 사용 하려면 먼저 해당 확인 하십시오 있는 소비자 버스 참조 모델입니다.

DSL은 노출 된 DSL에 대 한 참조를 사용할 수 있도록

  1. DSL 정의 다이어그램 다이어그램의 주요 부분을 마우스 오른쪽 단추로 클릭 하 고 다음을 클릭 사용 Modelbus.

  2. 선택 대화 상자에서 에 버스에 대 한 참조 모델을 사용 하려면이 모델을 사용 하도록 설정.

  3. 많이 DSL Dsl 프로젝트에서 다음 어셈블리는 프로젝트 참조를 추가 합니다.노출 된 DSL은 ModelBusAdapter\bin\ * 디렉터리에 이러한 어셈블리 (.dll 파일)를 찾을 수 있습니다.

    • 예를 들어 노출 된 DSL 어셈블리Fabrikam.FamilyTree.Dsl.dll

    • 예를 들어 모델 노출 된 버스 어댑터 어셈블리Fabrikam.FamilyTree.ModelBusAdapter.dll

  4. 다음을 추가 합니다.NET 어셈블리의 DSL 프로젝트가 프로젝트 참조 합니다.

    1. Microsoft.VisualStudio.Modeling.Sdk.Integration.11.0.dll

    2. Microsoft.VisualStudio.Modeling.Sdk.Integration.Shell.11.0.dll

모델 버스 참조 도메인 속성에 저장할 수

  1. DSL 정의 소요 DSL의 도메인 속성을 도메인 클래스에 추가 후 해당 이름을 설정 합니다.

  2. 속성 창을 선택 하 고 도메인 속성을 설정 형식 에 ModelBusReference.

이 단계에서 프로그램 코드 속성 값을 설정할 수 있습니다 있지만 속성 창에서 읽기 전용입니다.

특별 한 ModelBus 참조 편집기를 사용 하 여 속성을 설정할 수 있습니다.이 편집기의 두 가지 버전이 나 선택: 모델 파일을 선택 하도록 허용 하 고 다른 모델 파일과 모델 안에서 요소를 선택할 수 있습니다.

모델 버스에서 도메인 속성을 설정할 수 있도록.

  1. 도메인 속성을 마우스 오른쪽 단추로 클릭 하 고 다음을 클릭 특정 속성 편집 ModelBusReference.대화 상자를 엽니다.이것은 모델 버스 선택.

  2. 적절 한 선택 종류의 ModelBusReference: 모델 또는 모델 내의 요소 수입니다.

  3. 파일 대화 상자 필터 문자열에는 문자열 같은 입력 Family Tree files |*.ftree.Subsitute를 노출 된 DSL의 파일 확장명입니다.

  4. 모델에 있는 요소를 참조 하도록 선택한 경우 Company.FamilyTree.Person 예를 들어 사용자가 선택할 수 있습니다, 종류를 추가할 수 있습니다.

  5. 클릭 확인, 다음을 클릭 하 고 모든 템플릿 변환 솔루션 탐색기 도구 모음에서 합니다.

    주의 정보주의

    유효한 모델 또는 엔터티를 선택 해야 하는 경우 활성화 된 나타날 수 있습니다 경우에 확인 단추 적용 되지 않습니다을 해야 합니다.

  6. Company.familytree.person와 같은 대상 형식 목록을 지정 하는 경우 다음 사용자를 DSL 프로젝트에 어셈블리 참조 대상 DSL, 예를 들어 Company.FamilyTree.Dsl.dll DLL을 참조 하 추가 해야

버스 모델 참조를 테스트 하려면

  1. 노출 되 고 소비 Dsl을 작성 합니다.

  2. Dsl 중 하나 실험 모드로 f5 키 또는 CTRL + f 5를 키를 눌러 실행 합니다.

  3. 디버깅 프로젝트의 실험적인 인스턴스에서 Visual Studio, 각 DSL의 인스턴스는 파일을 추가 합니다.

    [!참고]

    Visual StudioModelBus 모델의 같은 항목에 대 한 참조를 해결할 수 있습니다만 Visual Studio 솔루션입니다.예를 들어, 파일 시스템의 다른 부분에서 모델 파일에 대 한 참조를 만들 수 없습니다.

  4. 몇 가지 요소 및 링크에 노출 된 DSL의 인스턴스를 만들고 저장 합니다.

  5. 많이 DSL의 인스턴스를 열고 버스 참조 모델 속성은 모델 요소를 선택 합니다.

  6. 속성 창에서 모델 버스 참조 속성을 두 번 클릭 합니다.선택 대화 상자를 엽니다.

  7. 클릭 찾아보기 및 노출 된 DSL의 인스턴스를 선택 합니다.

    버스에 대 한 참조 모델의 요소에 따라 종류를 지정 하는 경우는 선택을 또한 모델에서 항목을 선택 수 있습니다.

프로그램 코드에서 참조를 작성합니다.

모델 또는 모델 내의 요소에 대 한 참조를 저장 하려는 경우 만들는 ModelBusReference.두 가지 종류의 ModelBusReference: 참조 및 참조 요소를 모델링 합니다.

모델에 대 한 참조를 만들려면 Adaptermanager의 모델이 파일 이름 및 인스턴스를 DSL의 필요 또는 Visual Studio 모델의 프로젝트 항목입니다.

요소에 대 한 참조를 만들려면 어댑터를 해야 모델 파일에서 및 요소를 참조 하십시오.

[!참고]

로 Visual Studio Modelbus를 만들 수 있습니다 참조 항목에만 동일한 Visual Studio 솔루션입니다.

Ff519531.collapse_all(ko-kr,VS.110).gif노출 된 DSL 어셈블리 가져오기

많이 프로젝트에 노출 된 DSL의 DSL 및 ModelBusAdapter 어셈블리에 프로젝트 참조를 추가 합니다.

예를 들어, ModelBus 참조 MusicLibrary DSL 요소에 저장 하려는 경우를 가정 합니다.ModelBus 참조 FamilyTree DSL의 요소를 참조 합니다.에 있는 Dsl MusicLibrary 솔루션의 참조 노드에서 프로젝트에서 다음 어셈블리에 대 한 참조를 추가 합니다.

  • Fabrikam.FamilyTree.Dsl.dll-노출 된 DSL입니다.

  • Fabrikam.FamilyTree.ModelBusAdapters.dll-노출 된 DSL의 ModelBus 어댑터입니다.

  • 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;
...

Ff519531.collapse_all(ko-kr,VS.110).gif모델에 대 한 참조를 만들려면

모델에 대 한 참조를 만들려면 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 의 편집기 특성 매개 변수로.자세한 내용은 허용 사용자 편집에 대 한 참조를.

Ff519531.collapse_all(ko-kr,VS.110).gif요소에 대 한 참조를 만들려면

모델에 대해 만든 어댑터 만들고 참조를 해결 하려면 사용할 수 있습니다.

// person is an element in the FamilyTree model:
ModelBusReference personReference = 
  adapter.GetElementReference(person);

사용할 수 없게 하려면 elementReference 나중에 하면 도메인 속성에서 외부 형식에 저장할 수 있는 ModelBusReference.사용자가 편집할 수 있도록 하려면 사용 ModelElementReferenceEditor 의 편집기 특성 매개 변수로.자세한 내용은 허용 사용자 편집에 대 한 참조를.

Ff519531.collapse_all(ko-kr,VS.110).gif참조 확인

경우는 ModelBusReference (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 참조를 확인

  1. 액세스 하려는 DSL 텍스트 템플릿에서 액세스를 위해 구성 된 ModelBus 어댑터가 있어야 합니다.자세한 내용은 To provide access to a DSL를 참조하십시오.

  2. 일반적으로 원본 DSL에서 DSL 모델 버스 참조 (MBR)를 사용 하 여 저장 된 대상을 액세스할 수 있습니다.서식 파일을 따라서 MBR를 해결 하려면 DSL, 소스 코드의 지시문을 포함 합니다.텍스트 템플릿에 대한 자세한 내용은 도메인별 언어에서 코드 생성을 참조하십시오.

    <#@ 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)는 문자열의 형태로 serialize 수 있습니다:

string serialized = modelBus.SerializeReference(elementReference);
// Store it anywhere, then get it back again:
ModelBusReference elementReferenceRestored =
    modelBus.DeserializeReference(serialized, null);

이 이런 식으로 연속 되는 MBR의 컨텍스트를 독립적입니다.간단한 파일 기반 모델 버스 어댑터를 사용 하는 경우 MBR 절대 파일 경로 포함 합니다.인스턴스 모델 파일은 이동 하는 경우에 적합 합니다.그러나 항목을 모델 파일은 일반적으로 수는 Visual Studio 프로젝트입니다.사용자가 전체 프로젝트 파일 시스템의 다른 부분으로 이동할 수 받게 됩니다.소스 제어에서 프로젝트를 유지 하 고 다른 컴퓨터에서 엽니다 수 있도록는 받게 됩니다.따라서 경로 이름은 파일이 포함 된 프로젝트의 위치를 기준으로 serialize 합니다.

Ff519531.collapse_all(ko-kr,VS.110).gif지정 된 파일 경로에 상대적인 직렬화

A ModelBusReference 포함 되어 있는 ReferenceContext, 기준이 되어야 될 serialize 파일 경로 등의 정보를 저장할 수 있는 사전입니다.

상대 경로를 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);

Ff519531.collapse_all(ko-kr,VS.110).gif기타 어댑터에서 만든 ModelBusReferences

다음 정보 어댑터를 직접 만들려는 경우에 유용 합니다.

A ModelBusReference (MBR)의 두 부분으로 구성 됩니다: 모델 버스에서 deserialize 되는 MBR 헤더 및 특정 어댑터 관리자에 의해 처리 되는 어댑터와 관련 됩니다.자신의 어댑터 직렬화 형식을 제공할 수 있습니다.예를 들어, 파일을 실행 하는 것이 아니라 데이터베이스를 참조할 수 또는 어댑터 참조에 추가 정보를 저장할 수 있습니다.어댑터를 직접 추가 정보를 넣을 수 있습니다의 ReferenceContext.

MBR을 deserialize 하는 경우 MBR 개체에 저장 되어 다음에 Referencecontext을 제공 해야 합니다.MBR을 serialize 하는 경우 저장 된 Referencecontext는 문자열을 생성 하는 데 도움이 되는 어댑터에서 사용 됩니다.Deserialize 된 문자열에는 Referencecontext의 모든 정보가 없습니다.예를 들어, 간단한 파일 기반 어댑터는 ReferenceContext serialize 된 MBR 문자열에 저장 되지 않은 루트 파일 경로 포함 합니다.

MBR에는 2 단계로 deserialize 되:

  • ModelBusReferencePropertySerializerMBR 헤더를 처리 하는 표준 직렬 변환기가입니다.표준 DSL을 사용 하 여 SerializationContext 에 저장 하는 속성 모음에 ReferenceContext 키를 사용 하 여 ModelBusReferencePropertySerializer.ModelBusLoadContextKey.특히는 SerializationContext 의 인스턴스를 포함 해야 합니다 ModelBus.

  • ModelBus 어댑터를 MBR 어댑터 특정 부분을 처리합니다.MBR의 Referencecontext에 저장 된 추가 정보를 사용할 수 있습니다.간단한 파일 기반 어댑터의 키를 사용 하 여 루트 파일 경로 유지 FilePathLoadContextKey 및 FilePathSaveContextKey.

    이 사용 될 때에 어댑터 참조 모델 파일에서 deserialize 되.

모델을 만들려면

Ff519531.collapse_all(ko-kr,VS.110).gif만들기, 열기 및 모델 편집

다음 VMSDK 웹 사이트에서의 상태 시스템 샘플에서 가져온 것입니다.이 모델은 모델을 만들고 하 고 모델에 연관 된 다이어그램을 얻을 수 ModelBusReferences 사용을 하는 방법을 보여 줍니다.

이 샘플에서는 DSL 대상 이름 상태 시스템입니다.몇 가지 이름, 모델 클래스 및 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를 선택 하 고 노출 하는 Modelbus이이 DSL:

  • 새 프로젝트를 ModelBusAdapter 를 솔루션에 추가 됩니다.

  • 참조를 ModelBusAdapter 추가 되는 DslPackage 프로젝트입니다.ModelBusAdapter참조 하는 Dsl 프로젝트입니다.

  • DslPackage\source.extention.tt, |ModelBusAdapter| 는 MEF 구성 요소로 추가 됩니다.

참고 항목

개념

방법: 프로그램 코드로 파일에서 모델 열기

방법: UML 모델을 다른 모델 및 도구와 통합

방법: 끌어서 놓기 처리기 추가

텍스트 템플릿에서 Visual Studio ModelBus 사용