데이터베이스 프로젝트에 대한 사용자 지정 기능 만들기
사용자 지정 기능을 추가하여 기존 데이터베이스 프로젝트 형식을 확장할 수 있습니다. 예를 들어 데이터베이스 프로젝트가 로드되거나 저장될 때마다 특정 작업을 수행하는 기능을 만들 수 있습니다. 사용자 지정 데이터베이스 스키마 공급자와 지원 프로젝트 시스템을 만들 수도 있습니다. 하지만 이러한 유형의 확장성은 여기에서 다루지 않습니다.
일반 작업
일반 작업 |
지원 내용 |
---|---|
확장성 지점에 대한 자세한 내용: 데이터베이스 프로젝트 확장성의 디자인에 대해 알아봅니다. |
|
샘플 프로젝트 기능 만들기: 데이터베이스 프로젝트가 로드될 때 대화 상자를 표시하는 사용자 지정 프로젝트 기능을 만드는 데 필요한 단계를 알아봅니다. 이러한 연습을 통해 다음 작업을 수행해 봅니다.
|
|
사용자 지정 프로젝트 기능 설치: 프로젝트 기능을 만들어 빌드한 후에는 이를 설치해야 Visual Studio에서 인식됩니다. |
프로젝트 확장성의 목적
Visual Studio 2010에서 데이터베이스 프로젝트 확장성 기능의 주요 목적은 다음과 같습니다.
인터페이스를 통해 주요 구성 요소 노출
이렇게 하면 추상 클래스 대신 인터페이스를 사용하여 프로젝트 시스템이 스키마 모델과 일치하도록 할 수 있습니다. 단 하나의 구체적 클래스만으로 여러 인터페이스를 구현할 수 있습니다.확장성 관리자를 통해 기능 만들기
기능은 솔루션 탐색기, 스키마 뷰, 프로젝트 업그레이드 및 프로젝트 속성을 비롯한 시스템의 주요 부분을 담당합니다.기능 확장
기능에서는 확장성 관리자, XML 파일, 레지스트리 또는 그 밖의 방법으로 기능 확장성을 제공할 수 있습니다.서비스 자체의 인터페이스를 통해 서비스 노출
DataPackage는 IServiceProvider를 구현합니다. 기능 간의 상호 작용은 이 수준에서의 서비스를 통해 처리되어야 합니다. 기능을 서비스로 노출해서는 안 됩니다. 대신 새 인터페이스인 래퍼 클래스를 만든 다음 이 래퍼를 서비스로 노출합니다.이벤트 구동 프로젝트 시스템 사용
DataPackage와 ProjectNode()에서는 기능을 사용하도록 설정하여 프로젝트 시스템을 구동시키는 이벤트를 제공합니다. 또한 기능에서는 해당 서비스 인터페이스를 통해 이벤트를 제공할 수 있습니다. 일부 경우에는 대리자를 사용할 수도 있습니다. 작업을 처리할 기능을 결정하려면 우선 순위에 따라 기능이 상호 작용할 수 있는 이벤트 방법을 사용하는 것이 좋습니다.수신기 순서에 의존하지 않음
이벤트에 대한 수신기 순서가 중요한 경우 사전 또는 사후 이벤트를 만들거나 EventArg에서 파생된 클래스에 우선 순위 속성을 추가하는 것이 좋습니다.
구성 요소 모델 어셈블리
Visual Studio에서 데이터베이스 프로젝트 시스템을 제공하는 어셈블리는 다음과 같습니다.
Microsoft.VisualStudio.Data.Schema.Package.dll
기본 프로젝트 시스템으로 부트스트래핑 및 이벤트 기능을 제공합니다. 여기에는 데이터베이스와 관계가 없는 스크립트 등의 기능이 포함됩니다.Microsoft.VisualStudio.Data.Schema.PackageUI.dll
데이터베이스와 관계가 없는 패키지를 위한 위성 어셈블리입니다.Microsoft.VisualStudio.Data.Schema.Package.Sql.dll
Visual Studio의 SQL Server 관련 기능, 편집기 및 도구 창입니다.Microsoft.VisualStudio.Data.Schema.Package.SqlUI.dll
SQL Server 관련 기능, 편집기 및 도구 창을 위한 위성 어셈블리입니다.
확장성 지점
데이터베이스 프로젝트 시스템의 다음 지점을 확장할 수 있습니다.
IDatabaseProjectFeature (AllowMultipleExtensions =true)
프로젝트 시스템의 주 확장성 지점입니다. 프로젝트 및 관련 요소를 제어하는 기능이 디자인되어 있습니다. 이러한 기능에서 선택적으로 구현할 수 있는 몇 가지 인터페이스로 IOleCommandTarget, IDatabaseProjectPriorityCommandTarget, IDatabaseProjectPropertyPageContributor, IDatabaseProjectExtenderContributor<TExtendee>, IDatabaseProjectAddNewItemParticipant, IDatabaseProjectIdleProcessor 및 IDatabaseProjectPartialProjectParticipant가 있습니다.IDatabaseProjectBuildActionContributor (AllowMultipleExtensions =false)
프로젝트 시스템의 가능한 빌드 작업 목록에 BuildAction 문자열을 적용합니다. 예를 들어 SQL Server 프로젝트 시스템에서는 Predeploy 및 Postdeploy를 적용합니다.IDatabaseProjectUserFileContributor (AllowMultipleExtensions =false)
.user 파일로 라우트해야 하는 속성을 지정합니다.IDatabaseSchemaViewController (AllowMultipleExtensions =false)
스키마 뷰를 채우고 해당 뷰에서의 이벤트에 응답합니다.IDatabaseProjectFileUpgradeController (AllowMultipleExtensions =false)
프로젝트 파일을 XML 문서로 업그레이드합니다. 이 프로세스는 Visual Studio 프로젝트 시스템에서 프로젝트 팩터리를 통해 프로젝트 인스턴스의 로드를 시도하기 전에 수행됩니다.IDatabaseProjectReferenceController (AllowMultipleExtensions = false)
프로젝트 참조를 제어합니다.IDatabaseProjectPartialProjectParticipant (AllowMultipleExtensions = true)
기능에서 부분 프로젝트로 내보내면 안 되는 파일을 필터링할 수 있도록 합니다.IDatabaseProjectHelpKeywordProvider
사용자가 F1 키를 누를 때 사용되는 프로젝트 시스템 도움말 키워드를 제공합니다.
데이터베이스 프로젝트 수명 주기
모든 데이터베이스 프로젝트 파일(.dbproj)에는 프로젝트가 Visual Studio에서 열릴 때 이 프로젝트를 처리하는 특정 DatabaseSchemaProvider를 나타내는 "DSP"라는 속성이 있습니다. 프로젝트 시스템에서는 이 DSP를 사용하여 확장 관리자를 만들고 여기에서 프로젝트 시스템 생성자 및 프로젝트 기능을 모두 생성합니다. 각 기능은 이벤트를 수신하여 자체적으로 초기화되고 프로젝트 시스템에 배치될 수 있도록 Initialize 이벤트를 받습니다.
다음 이벤트는 프로젝트를 열고 닫거나 저장할 때 발생합니다.
NewProjectCreated
이 이벤트는 프로젝트가 처음 만들어질 때 발생합니다. 이 이벤트를 처리하여 마법사나 설정 대화 상자를 표시할 수 있습니다.ProjectOpening
프로젝트를 열고 있습니다. 이 이벤트를 처리하여 IDatabaseProjectNode에 서비스를 추가할 수 있습니다.ProjectOpened
이 이벤트는 모든 서비스가 추가되고 프로젝트 열기가 완료된 후에 발생합니다. 하지만 프로젝트의 이전 상태를 deserialize하는 작업은 아직 완료되지 않은 상태입니다. ProjectLoaded 이벤트를 받을 때까지 TaskHost와 DataSchemaModel은 NULL이 됩니다.ProjectLoaded
프로젝트가 완전히 로드되었습니다. 이제 TaskHost와 DataSchemaModel을 사용할 수 있습니다.ProjectClosing
프로젝트를 닫고 있습니다. 프로젝트 파일 외부에 있는 상태 정보를 저장하기에 좋은 시점입니다.ProjectClosed
프로젝트가 닫혔습니다.ProjectSaving
프로젝트에서 저장 작업을 수행하고 있습니다. 이 이벤트가 발생할 때 기능이 지속성을 저장할 상태에 있는지 확인할 수 있습니다.ProjectSaved
프로젝트가 저장되었습니다.
오류 관리
모든 프로젝트에는 하나의 ErrorManager가 있습니다. 일부 오류는 .dbmdl 파일에 저장되지만 그 외의 오류는 그렇지 않습니다. 이는 AddPersistedCategory 클래스를 통해 제어됩니다. 기본적으로 지속되는 범주는 ModelCategory, ValidationAtBuildCategory 및 ValidationOnIdleCategory입니다. 지속되는 다른 범주를 추가할 경우 프로젝트 재로드를 처리하고 오류를 확인 및 관리해야 합니다. 프로젝트는 닫혔지만 사용자가 .dbproj 파일을 편집하여 오류를 보고하려는 해당 파일을 제거했을 수 있으므로 주의해야 합니다. 해당 파일이 없는 프로젝트에서 오류를 보고하면 사용자에게 혼란을 주게 됩니다.
데이터베이스 오류 개체는 특정 범주의 ErrorManager에 추가됩니다. 이는 프로젝트 기능에서 범주의 수명을 통해 해당 오류의 수명을 관리할 수 있도록 하기 위한 것입니다. 범주 이름이 다른 기능과 충돌하지 않도록 하려면 GUID를 이름으로 사용합니다. ErrorManager는 다음을 비롯한 여러 기본 제공 범주를 정의합니다.
DefaultCategory
이 범주는 프로젝트 수명과 수명이 같은 오류에 사용하기 위한 것입니다. 예를 들어 프로젝트 로드 중에 발생하는 오류는 이 범주에 추가됩니다.ModelCategory
이 범주는 스키마 관리자에서 파서 오류와 같은 오류가 발생할 때 사용되어야 합니다.
관련 시나리오
사용자 지정 데이터베이스 리팩터링 형식 또는 대상 만들기
데이터베이스 코드를 분석하기 위한 추가 규칙 만들기 및 등록
사용자 지정 데이터 생성기를 통해 특수 테스트 데이터 생성
빌드 및 배포 참가자를 사용하여 데이터베이스 빌드 및 배포 사용자 지정