次の方法で共有


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

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

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

Visual Studio Premium または Visual Studio Ultimate に含まれていない新しいリファクタリングの種類を有効にするには、RefactoringOperation 抽象基本クラスから継承して、カスタム リファクタリング操作を作成します。 たとえば、独立した IF ステートメントが連続している場合に、入れ子になった条件をガード句に置き換える新しいリファクタリングの種類を実装できます。

データベース リファクタリングとリファクタリング コントリビューター

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

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

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

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

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

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

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

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

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

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

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

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

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

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

リファレンス コントリビューターは、データ スキーマ モデルからすべての参照とそのオフセットを取得し、データ スキーマ モデルのコピー オン ライト ストア内の参照を更新します。 更新されたスクリプト DOM は元のスクリプト DOM と比較され、その結果を使用して、変更された参照を含むスクリプトが更新されます。

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

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

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

DGen および UnitTest コントリビューターのデータ フロー

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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