データベース リファクタリングの機能拡張の概要

データベース リファクタリングの機能を拡張すると、新しい種類のリファクタリングを提供することも、新しいファイルの種類をリファクタすることもできます。 機能拡張を作成することにより、両方の種類の拡張性をデータベース リファクタリングに実装できます。 データベース リファクタリングの機能拡張を作成する前に、データベース リファクタリングの各コンポーネントが互いにどのように対話するのか、またこれらをどこで拡張できるのかについて理解する必要があります。

データベース リファクタリングを新しいターゲット上で操作できるようにするには、RefactoringContributor 抽象基本クラスを継承することで、カスタムのリファクタリング コントリビュータを作成できます。 たとえば、データベース プロジェクトに含まれるテキスト ファイルまたは XML ファイルへのリファクタリングをサポートできます。

Visual Studio Team System Database Edition に含まれていない新しいリファクタリングの種類を有効にするには、RefactoringOperation 抽象基本クラスを継承することにより、カスタムのリファクタリング操作を作成できます。 たとえば、入れ子になった条件記述がある場合には、一連の独立した IF ステートメント内にそれぞれガード句があるという形に置き換わるような、新しいリファクタリングの種類を実装することができます。

データベース リファクタリングおよびリファクタリング コントリビュータ

次の図は、データベース リファクタリングが、リファクタリング コントリビュータとして知られるコンポーネントを使用して特定の種類のリファクタリングを処理する方法を示しています。

データベース リファクタリングの機能拡張の概要
デデータベース リファクタリングの機能拡張の概要

Visual Studio の現在のセッションで初めてデータベース リファクタリング操作を適用する際には、リファクタリング機能は、すべてのリファクタリングの種類およびコントリビュータと共に読み込まれます。 指定したコマンドがリファクタリング機能に渡され、指定した種類のリファクタリングが開始されます。 リファクタリング コントリビュータ マネージャは、指定したリファクタリングの種類に対して登録されている各コントリビュータをループで処理します。 コントリビュータの種類はそれぞれ、異なるオブジェクトまたはオブジェクトのセットを対象にします。それぞれの種類には、異なるデータ フローを定義できます。

新しい種類のリファクタリングを実装する場合、その種類のリファクタリング操作をサポートするために必要なコントリビュータを作成する必要があります。 たとえば、入れ子になった条件記述をガード句に置き換える新しい種類のリファクタリングを作成する必要があるとします。 その種類のリファクタリングでは、プロシージャまたは関数の本体のみが変更されるのであり、データベース オブジェクト名の変更は一切生じないので、スキーマ オブジェクト コントリビュータおよびスクリプト コントリビュータを作成するだけで済みます。

スキーマ オブジェクト コントリビュータ

次の図は、データベース スキーマ オブジェクトを処理するリファクタリング コントリビュータのデータ フローを示しています。

スキーマ オブジェクト コントリビュータのデータ フロー
スキーマ オブジェクト コントリビュータのデータ フロー

スキーマ オブジェクト コントリビュータには、スキーマ オブジェクトの定義を更新する働きがあります。 このコントリビュータはスキーマ マネージャのコピー オン ライト ストアを更新します。 更新された IStoreElement はスクリプト ドメイン オブジェクト モデル (スクリプト DOM) ビルダに渡され、更新されたスクリプト DOM の生成に使用されます。 更新されたスクリプト DOM は、スクリプト DOM 差分エンジンを使用してそのオブジェクトの元の定義のスクリプト DOM と比較され、更新されたスクリプトが生成されます。

リファレンス コントリビュータ

次の図は、オブジェクト間の参照を処理するリファレンス コントリビュータのデータ フローを示しています。

リファレンス コントリビュータのデータ フロー
リファレンス コントリビュータのデータ フロー

リファレンス コントリビュータは、スキーマ マネージャからすべての参照およびそのオフセットを取得し、スキーマ マネージャのコピー オン ライト ストア内でこれらの参照を更新します。 更新されたスクリプト DOM は、元のスクリプト DOM と比較され、その結果を使用して、変更された参照を含んでいるスクリプトが更新されます。

データ生成計画コントリビュータとデータベース単体テスト コントリビュータ

次の図は、データ生成計画コントリビュータとデータベース単体テスト コントリビュータのデータ フローを示しています。

データ生成計画コントリビュータとデータベース単体テスト コントリビュータのデータ フロー
DGen および UnitTest の各コントリビュータのデータ フロー

データ生成計画のコントリビュータは、XPathNavigator を使用して、XML ファイルであるデータ生成計画内の変更を検索および更新します。

データベース単体テストのコントリビュータは、データベース単体テストの .resx ファイルを分析し、そのファイルに格納されているスクリプト文字列を抽出します。 次にこれらのスクリプト文字列が、データベース スクリプト コントリビュータの場合と同じデータ フローを使用して処理されます。

データベース スクリプト コントリビュータ

次の図は、データベース スクリプト コントリビュータのデータ フローを示しています。

データベース スクリプト コントリビュータのデータ フロー
データベース スクリプト コントリビュータのデータ フロー

データベース スクリプト コントリビュータは、配置前スクリプトと配置後スクリプト、その他の .sql スクリプト、およびデータベース単体テストから抽出した SQL スクリプト文字列の更新を処理します。 モデル ビルダは、スクリプトを取得して、スキーマ マネージャの一時ストアにスクリプトのモデルをビルドします。 一時ストアを使用して、変更されたスクリプト DOM モデルが作成されます。 変更されたモデルは元のスクリプトのモデルと比較され、その差分を使用して、最終更新スクリプトが生成されます。

カスタム コントリビュータ

独自のカスタム コントリビュータを作成すると、このトピックでこれまでに説明されたもの以外のリファクタリング ターゲットをサポートすることができます。 たとえば、テキスト ファイル、データベース ドキュメント、またはサード パーティ ツールの出力を更新するためのカスタム コントリビュータを作成できます。 ただし、リファクタリング ターゲットをサポートするために必要な正しいデータ フローを決定する必要があります。 新しい種類のターゲットが既存のコントリビュータのターゲットの種類と似ている場合は、このトピックで前に説明した種類を参照してください。

データベース リファクタリングの種類

新しいリファクタリングの種類を作成することで、リファクタリングの新しい種類を有効にできます。 新しいリファクタリングの種類を作成するには、少なくとも、次の基本クラスを継承する 4 つのクラスを実装します。

  • RefactoringCommand
    新しい種類のリファクタリングを提供するには、このクラスを登録します。 このクラスは、どのモデル要素に対してコマンドを使用できるようにするかを指定し、そのコマンドがクリックされたときにリファクタリング操作を呼び出します。

  • RefactoringOperation
    このクラスは、リファクタリング操作がどのようにプレビュー ウィンドウと対話するかを指定すると共に、操作を記述するプロパティを指定し、ContributorInput を作成します。

  • ContributorInput
    このクラスは、リファクタリング コントリビュータに入力データを格納します。 プライマリ コントリビュータがリファクタリング操作を完了するためにセカンダリ コントリビュータを必要とする場合、ContributorInput から派生する複数のクラスを作成する必要が生じる場合があります。 たとえば、オブジェクトの名前を変更する場合、オブジェクト自体を変更するだけでなく、そのオブジェクトへのすべての参照も変更する必要があります。 このため、シンボルに対して 1 つの ContributorInput を作成すると共に、そのシンボルへのすべての参照に対してもう 1 つ ContributorInput を作成する必要があります。

  • RefactoringContributor
    このクラスは、指定された入力に基づいて変更提案の一覧を作成します。 ContributorInput の場合と同様、RefactoringContributor から派生する複数のクラスを作成する必要が生じる場合があります。 セカンダリ ContributorInput が必要である場合、その入力はプライマリ RefactoringContributor で作成します。 このクラスでは、リファクタリング コントリビュータと互換性があるデータベース スキーマ プロバイダを宣言する必要があります。 また、リファクタリングの種類に対応するすべてのコントリビュータとリファクタリング コマンドを登録する必要があります。

データベース リファクタリングのターゲット

リファクタリングの登録済みの種類を拡張すると、新しい種類のモデル要素や新しいファイルなど、新しいターゲットを操作することができます。 リファクタリングで新しいターゲットを操作できるようにするには、新しいリファクタリング コントリビュータを作成する必要があります。 新しいコントリビュータは、その種類のリファクタリングに対する定義済み ContributorInput のいずれか 1 つを操作できる必要があります。 新しいリファクタリング ターゲットまたはコントリビュータを作成するには、少なくとも、次の基本クラスを継承するクラスを 1 つ実装します。

  • RefactoringContributor
    このクラスは、指定された入力に基づいて変更提案の一覧を作成します。 このクラスでは、リファクタリング コントリビュータと互換性があるデータベース スキーマ プロバイダを宣言し、リファクタリングの種類に対応するコントリビュータをすべて登録する必要があります。

参照

概念

Database Edition の用語の概要