既存のデータベース プロジェクトの種類に独自の機能を追加して、データベース プロジェクトを拡張できます。 たとえば、データベース プロジェクトの読み込み時または保存時に特定の処理を実行する機能を作成できます。 また、独自のデータベース スキーマ プロバイダーまたはサポート プロジェクト システムを作成することもできます。 ただし、このような種類の機能拡張については、ここでは説明しません。
一般的なタスク
一般的なタスク |
関連する参照先 |
---|---|
拡張ポイントの詳細を理解する: データベース プロジェクト機能拡張の設計について説明します。 |
|
サンプル プロジェクト機能を作成する: データベース プロジェクトの読み込み時にダイアログ ボックスを表示するカスタム プロジェクト機能を作成するために必要な手順について説明します。 これらのチュートリアルを実行することにより、次のタスクの手順を習得できます。
|
|
カスタム プロジェクト機能をインストールする: プロジェクト機能を作成してビルドした後に、このプロジェクト機能をインストールして 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
このイベントは、すべてのサービスが追加され、プロジェクトを開く処理が完了したときに発生します。 ただし、プロジェクトの前の状態の逆シリアル化は完了していません。 TaskHost および DataSchemaModel は、ProjectLoaded イベントが送信されるまでは NULL になります。ProjectLoaded
プロジェクトの読み込みが完了しました。 TaskHost および DataSchemaModel は、使用の準備ができています。ProjectClosing
プロジェクトを閉じています。 このイベントを使用して、プロジェクト ファイルに含まれていない状態情報を永続化することができます。ProjectClosed
プロジェクトは閉じられました。ProjectSaving
プロジェクトの保存操作を実行しています。 このイベントを使用して、機能の状態を確実に永続化して保存できます。ProjectSaved
プロジェクトの保存が完了しました。
エラー管理
各プロジェクトには、1 つの ErrorManager があります。 エラーによっては、.dbmdl ファイルに永続化される場合とされない場合があります。 これは、AddPersistedCategory クラスを使用して制御されます。 既定では、ModelCategory、ValidationAtBuildCategory、および ValidationOnIdleCategory の各カテゴリは永続化されます。 別の永続化されたカテゴリを追加した場合は、プロジェクトの再読み込みを行い、エラーを検証して管理する必要があります。 プロジェクトが閉じていても、ユーザーが .dbproj ファイルを編集してエラー報告の書き込み先のファイルを削除する場合があります。 このファイルがないと、プロジェクトのエラーを報告する際にユーザーの混乱を招きます。
データベース エラー オブジェクトは、特定のカテゴリで ErrorManager に追加されます。 これは、プロジェクト機能では、そのカテゴリの有効期間全体にわたって、エラーの有効期間を管理できるということを意味します。 カテゴリ名が他の機能と競合するおそれがある場合は、GUID を名前として使用してください。 ErrorManager には、次のような組み込みのカテゴリが定義されています。
DefaultCategory
このカテゴリは、エラーの有効期間がプロジェクトの有効期間と同じ場合に使用します。 たとえば、プロジェクトの読み込み中に発生したエラーは、このカテゴリに追加されます。ModelCategory
このカテゴリは、パーサー エラーなどのエラーが発生したときにスキーマ マネージャーによって使用されます。
関連するシナリオ
カスタムのデータベース リファクタリングの種類またはターゲットの作成
カスタム データ ジェネレーターを使用した特殊なテスト データの生成
ビルド コントリビューターおよび配置コントリビューターを利用してデータベースのビルドおよび配置をカスタマイズする