본 아티클은 MSDN 에 eBook으로 공개된 문서를 블로그 아티클로 편집하였습니다. VSTS 팀블로그에 의해 작성된 문서의 원문 및 여러 가지 기술 문서는 아래의 링크에서 PDF로 다운로드 받을 수 있습니다. 그리고 본문의 특정 버전을 지칭하는 개발툴 버전 번호는 모두 Visual Studio로 변경되었음을 참고하십시오. (예- Visual Studio 20xx는 Visual Studio로 표기함 )

VSTS 팀블로그 MSDN 기술 문서 : http://msdn.microsoft.com/ko-kr/gg620748 

필자 소개

Microsoft Visual Studio ALM MVP 엄준일
http://blog.powerumc.kr

 

Visual Studio Korea Team Blog
http://vsts2010.net

감수 : 강성재 부장
한국마이크로소프트 개발자 및 플랫폼 사업 총괄

   

도움주신 분 : 김남영 부장
한국마이크로소프트 개발자 및 플랫폼 사업 총괄

 

[Enterprise Architecture/Architecture] - 개발자도 알아야 할 응용 프로그램 모델링 1/7 - 들어가기에 앞서...
[Enterprise Architecture/Architecture] - 개발자도 알아야 할 응용 프로그램 모델링 2/7 - 왜 모델링인가?
[Enterprise Architecture/Architecture] - 개발자도 알아야 할 응용 프로그램 모델링 3/7 - 모델링의 표기
[Enterprise Architecture/Architecture] - 개발자도 알아야 할 응용 프로그램 모델링 4/7 - 모델링 다이어그램
[Enterprise Architecture/Architecture] - 개발자도 알아야 할 응용 프로그램 모델링 5/7 - Visualization & Features Pack
[Enterprise Architecture/Architecture] - 개발자도 알아야 할 응용 프로그램 모델링 6/7 - 모델링 확장 (SDK)
[Enterprise Architecture/Architecture] - 개발자도 알아야 할 응용 프로그램 모델링 7/7 - 결론 및 저자 소개

 

7. Visual Studio Modeling SDK

Vual Studio 2010 SDK(Software Development Kit)은 기존의 Visual Studio의 기능을 확장할 수 있는 도구를 지원해 주고 있습니다. 이 내용에 대해 자세한 내용은 필자의 블로그의 다음의 글을 참고 하십시오.

참고

[VSX] 1. Visual Studio Extensibility,, 그 시작

http://blog.powerumc.kr/232

 

7.1. 개발 환경 및 설치 요구 사항

Visual Studio 모델링 프로젝트를 확장하기 위해 먼저 Visual Studio SDK를 설치해야 합니다. Visual Studio SDK 는 아래의 다운로드 주소를 통해 다운로드 받으실 수 있습니다.

Visual Studio SDK 다운로드

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=47305cf4-2bea-43c0-91cd-1b853602dcc5&displaylang=en

 

시스템 요구 사항

  • Supported Operating Systems: Windows 7;Windows Server 2003 R2 (32-Bit x86);Windows Server 2003 R2 x64 editions;Windows Server 2003 Service Pack 2;Windows Server 2008 R2;Windows Server 2008 Service Pack 2;Windows Vista Service Pack 2;Windows XP Service Pack 3
    • Windows XP (x86) with Service Pack 3 - all editions except Starter Edition
    • Windows Vista (x86 & x64) with Service Pack 2 - all editions except Starter Edition
    • Windows 7 (x86 and x64)
    • Windows Server 2003 (x86 & x64) with Service Pack 2 - all editions
    • Users will need to install MSXML6 if not already present
    • Windows Server 2003 R2 (x86 and x64) - all editions
    • Windows Server 2008 (x86 and x64) with Service Pack 2 - all editions
    • Windows Server 2008 R2 (x64) - all editions

 

Visual Studio 2010 요구 사항

  • Visual Studio 2010 Professional or better

 

7.2. Layer Diagrams 확장하기

Visual Studio  SDK와 Visual Studio 2010 Visualization & Modeling Features Pack을 설치하면 Layer Diagrams을 확장할 수 있는 프로젝트 템플릿이 설치가 됩니다.

새 프로젝트 만들기에서 모델링 프로젝트->Extensibility 를 선택하면 세 가지의 새로운 템플릿이 생성이 된 것을 확인할 수 있습니다.

각 템플릿은 Layer Diagrams을 확장하기 위해 아래와 같은 기능을 수행하는 템플릿입니다.

  • Command Extension
    Layer Diagrams에 특정 컨텍스트 메뉴를 통해 명령을 수행할 수 있는 확장 기능을 만들 수 있습니다.

  • Gesture Extension
    Layer Diagrams으로 끌어오기 동작 등의 확장 기능을 만들 수 있습니다.

  • Validation Extension
    Layer Diagrams과 코드의 구조가 유효한지 검사하는 확장 기능을 만들 수 있습니다.

 

7.2.1. 레이어 개수를 세는 Command Extension 만들기

 

7.2.1.1. Layer Diagrams Command Extension 프로젝트 생성

우선 간단한 Command Extension을 만들기 위해 Command Extension 템플릿으로 프로젝트를 생성합니다. 프로젝트의 이름을 CustomLayerCommand (또는 희망하는 이름으로) 프로젝트를 생성합니다.

 

간단히 생성된 프로젝트를 실행 또는 디버깅 하기 위해서 생성된 Command Extension 프로젝트를 선택하여 마우스 오른쪽 버튼을 클릭하여 시작 프로젝트로 설정합니다.

 

그런 다음 F5 키를 눌러 디버깅을 시작합니다. F5키를 눌러 디버깅을 시작하면 Visual Studio 2010은 별도의 레지스트리를 사용하는 Experimental 모드로 실행을 하게 되어 기존의 Visual Studio 2010에 영향이 없도록 동작하게 됩니다.

 

7.2.1.2. Layer Diagrams에 명령 코드 만들기

Visual Studio 의 새로운 확장 기능은 .NET Framework 4.0에 포함되는 MEF(Managed Extensibility Framework)를 사용하여 확장 기능을 만들 수 있습니다. 모델링 확장 기능 또한 MEF를 사용하여 확장할 수 있으며 MEF에 대한 자세한 내용은 필자의 블로그를 참고 하시기 바랍니다.

참고

MEF(Managed Framework Extensibility) 연제
http://blog.powerumc.kr/189

 

우선 클래스의 선언은 다음과 같이 되어 있습니다 아래와 같이 ExportAttribute을 사용하여 ICommandExtension 형식을 Visual Studio 모델링에서 인식할 수 있도록 컴포넌트 계약을 합니다. 그리고 LayerDesignerExtensionAttriburte을 추가하면 Layer Diagrams에서 ICommandExtension 확장 기능을 사용할 수 있도록 합니다.

[Export(typeof(ICommandExtension))]
[LayerDesignerExtension]
public partial class CustomLayerCommandExtension : ICommandExtension 


클래스 내부에 Import된 IDiagramContext는 현재 다이어그램의 컨텍스트 개체로 이 개체를 이용하여 특정 명령을 내릴 때 다양한 작업을 수행할 수 있습니다.

[Export(typeof(ICommandExtension))]
[LayerDesignerExtension]
public partial class CustomLayerCommandExtension : ICommandExtension
{
    [Import(typeof(IDiagramContext))]
    public IDiagramContext DiagramContext { getset; } 


ICommandExtension의 인터페이스는 Text 속성을 구현해야 하는데 이 속성은 다이어그램 컨텍스트 메뉴에서 표시되는 메뉴 이름입니다.

public string Text
{
    get	
    {
        return "레이어 개수";
    } 
} 


ICommandExtension의 인터페이스는 QueryStatus를 구현해야 하는데, 현재 상태에서 컨텍스트에 표시될 수 있는지 여부를 나타내게 됩니다. 조건에 따라 다른 표시/보이기 등의 동작이 필요하다면 아래의 코드를 수정하시면 됩니다.

public void QueryStatus(IMenuCommand command)
{
            command.Visible = true;
            command.Enabled = true} 


마지막으로 ICommandExtension의 Execute 메서드를 구현합니다. 이 메서드는 Layer Diagrams의 레이어 개수를 계산하기 위해 재귀 호출을 통해서 레이어 요소의 개수를 카운트합니다.

public void Execute(IMenuCommand command)
{
    int layerCount = 0;
    this.VisitDiagramElement(this.DiagramContext.CurrentDiagram.Diagram.ChildShapes, ref layerCount);

 

    MessageBox.Show(String.Format("레이어의 개수는 모두 {0}  입니다.", layerCount));            
}

 

private void VisitDiagramElement(IEnumerable<IShape> shapes, ref int layerCount)
{
    foreach (var shape in shapes)
    {
        if (shape != null && shape.GetLayerElement() is ILayer)
        {
            layerCount++;

 

            if( shape.ChildShapes.Count() > 1) 
                this.VisitDiagramElement(shape.ChildShapes.Skip(1), ref layerCount);
        }
    } 
} 


7.2.1.3. Layer Diagrams 코드 실행 결과

먼저 작성된 코드를 실행하기 위해 Visual Studio 에서 Command Extension을 시작 프로젝트로 설정한 후에 F5 키를 눌러 Visual Studio Experimental 모드로 실행을 할 수 있습니다. 만약 디버깅이 필요하지 않다면 Ctrl+F5 키를 눌러 디버깅 없이 실행하여 실행 속도를 높일 수 있습니다.

위의 코드는 다음과 같이 Layer Diagrams에서 마우스 오른쪽 버튼을 눌러서 활성화할 수 있습니다. 다음과 같이 Text 속성의 반환 값이 메뉴의 이름이 되는 것을 확인할 수 있습니다.

 

해당 메뉴를 클릭하면 Execute 메서드가 실행이 되고 메시지 상자에 Layer Diagrams에 포함된 모든 레이어의 개수를 표시해 줍니다.

 


7.2.2. 폴더 구조를 DRAG&DROP 하는 Gestures Extension 만들기

7.2.2.1. Geatures Extension 프로젝트 만들기

새로운 프로젝트를 생성하는 메뉴에서 모델링 프로젝트->Extensibility 항목에서 Layer Designer Gesture Extension 을 선택하고 확인을 클릭합니다.

 

이 후 설정은 Layer Diagrams Command Extension 프로젝트 생성 항목을 참고하십시오.

 

7.2.2.2. 폴더를 Drag&Drop 하는 코드 만들기

Gesture Extension 은 IGestureExtension 인터페이스를 구현합니다. 이 인터페이스를 상속하는 클래스를 만든 후에 ExportAttribute을 통해 Visual Studio 2010의 모델링 Geature Extension과 계약 관계를 형성합니다.

[Export(typeof(IGestureExtension)), LayerDesignerExtensionpublic partial class CustomLayerGestureExtension : IGestureExtension 


폴더를 Drag&Drop 하는 코드 전체는 다음과 같습니다.


[Export(typeof(IGestureExtension)), LayerDesignerExtension]
partial class CustomLayerGestureExtension : IGestureExtension
{

        [Import(typeof(IDiagramContext))]
        public IDiagramContext DiagramContext { getset; }

 

        public void OnDoubleClick(IShape target) { }

 

        public bool CanDragDrop(IShape target, IDataObject data)
        {
            var folders = data.GetData(DataFormats.FileDrop) as String[];
            if (folders == null)
            {
                MessageBox.Show("가져올 데이터가 없습니다.");
            }

 

            var isValidate = true;
            foreach(var folder in folders)
            {
                if( System.IO.Directory.Exists(folder) == false )
                {
                    isValidate = false;
                    break;
                }
            }

 

            return true;
        }

 

        public void OnDragDrop(IShape target, IDataObject data)
        {
            var folders = data.GetData(DataFormats.FileDrop) as String[];

 

            foreach (var folder in folders)

            {                 var dirInfo = new System.IO.DirectoryInfo(folder);                 target.Diagram.GetLayerModel().CreateLayer(dirInfo.Name);             }         } }

 


7.2.2.3. 폴더를 Drag&Drop 하는 Gesture Extension 코드 실행 결과

먼저 테스트로 진행할 모델링 프로젝트를 생성한 후에 Layer Diagrams 항목을 추가 합니다.

그리고 윈도우 탐색기를 열어 드래그할 폴더를 다음과 같이 선택합니다.

 

선택할 폴더 항목을 Visual Studio 2010의 다이어그램 디자이너에 Drag하여 Drop합니다.

 

Drop 결과 해당하는 폴더의 이름대로 Layer Diagrams의 레이어 요소가 생성이 되는 결과를 확인할 수 있습니다.

신고
Posted by 땡초 POWERUMC

댓글을 달아 주세요