資料庫重構擴充性概觀
您可以擴充「資料庫重構」(Database Refactoring) 的功能,以提供新的重構類型或重構新的檔案類型。 您可以建立「擴充功能」(Feature Extension) 來實作上述兩種資料庫重構擴充性類型。 建立資料庫重構的擴充功能之前,您應了解資料庫重構元件的互動方式以及可擴充這些元件的位置。
若要讓資料庫重構處理新「目標」(Target),您可以藉由從 RefactoringContributor 抽象基底類別繼承的方式,建立自訂重構參與者。 例如,您可以支援重構至資料庫專案中包含的文字檔或 XML 檔。
若要啟用 Visual Studio Premium 或 Visual Studio Ultimate 未包含的新重構類型,您可以藉由從 RefactoringOperation 抽象基底類別繼承的方式,建立自訂重構作業。 例如,您可以實作新的重構類型,以使用成立條件子句取代一系列個別 IF 陳述式中的巢狀條件。
資料庫重構與重構參與者
下圖顯示資料庫重構如何使用稱為重構參與者的元件來處理特定重構類型。
資料庫重構擴充性概觀
當您在目前 Visual Studio 工作階段中第一次套用資料庫重構作業時,重構功能會連同所有重構類型和參與者一起載入。 您指定的命令會傳遞至重構功能,然後指定的重構類型便啟動。 重構參與者管理員會針對指定的重構類型註冊的每個參與者進行迴圈。 每種參與者類型會套用到不同的物件或一組物件,而且每種類型可能有不同的資料流程。
當您實作新的重構類型時,必須建立支援該重構作業類型所需的參與者。 例如,您可能會想建立新的重構類型,以使用成立條件子句取代巢狀條件。 由於該重構類型只會變更程序或函式的主體,不會變更任何「資料庫物件」(Database Object) 的名稱,因此您只需要建立結構描述物件參與者或指令碼參與者。
結構描述物件參與者
下圖顯示處理資料庫結構描述物件之重構參與者的資料流程。
結構描述物件參與者的資料流程
結構描述物件參與者會更新結構描述物件的定義。 該參與者會更新資料結構描述模型中的「寫入時複製存放區」。 更新的模型項目會傳遞至「指令碼網域物件模型」(Script Domain Object Model,Script DOM) 產生器,並用來產生更新的指令碼 DOM。 指令碼 DOM 差異引擎會將更新的指令碼 DOM 與該物件原始定義的指令碼 DOM 比較,然後產生更新的指令碼。
參考參與者
下圖顯示處理物件間參考之參考參與者的資料流程。
參考參與者的資料流程
參考參與者會從資料結構描述模型擷取所有參考及其位移,然後更新資料結構描述模型的「寫入時複製存放區」中的參考。 更新的指令碼 DOM 會與原始指令碼 DOM 比較,然後使用結果來更新包含已變更之參考的指令碼。
資料產生計劃與資料庫單元測試參與者
下圖顯示「資料產生計劃」(Data Generation Plan) 與「資料庫單元測試」(Database Unit Test) 參與者的資料流程。
資料產生計劃與資料庫單元測試參與者的資料流程
資料產生計劃參與者會使用 XPathNavigator 尋找和更新資料產生計劃這個 XML 檔中的變更。
資料庫單元測試參與者會分析資料庫單元測試的 .resx 檔,然後擷取儲存在該檔案中的指令碼字串。 這些指令碼字串接著再使用與資料庫指令碼參與者相同的資料流程進行處理。
資料庫指令碼參與者
下圖顯示資料庫指令碼參與者的資料流程。
資料庫指令碼參與者的資料流程
資料庫指令碼參與者會處理下列項目的更新:「預先部署指令碼」(Pre-Deployment Script) 和「部署後指令碼」(Post-Deployment Script)、其他 .sql 指令碼以及從資料庫單元測試擷取的 SQL 指令碼字串。 模型建立器會採用指令碼並在資料結構描述模型的暫存區中建立其模型。 暫存區是用來建立經修改的指令碼 DOM 模型。 這個經修改的模型會與原始指令碼的模型比較,再使用兩者的差異來產生最終更新的指令碼。
自訂參與者
您可以自行建立自訂參與者,以支援本主題前面未提及的其他重構目標。 例如,您可以建立自訂參與者來更新文字檔、資料庫文件或協力廠商工具輸出。 您必須判斷支援重構目標所需的正確資料流程。 如果新的目標類型與現有參與者的目標類型相似,請參考本主題前面所述的類型。
資料庫重構類型
您可以建立新的重構類型來啟用新類型的重構。 建立新重構類型的方式是實作繼承自下列基底類別的至少四個類別:
RefactoringCommand
您可以註冊此類別來提供新的重構類型。 此類別會指定哪些模型項目可使用命令,而且當使用者按一下命令時,會呼叫您的重構作業。RefactoringOperation
此類別會指定重構作業與預覽視窗的互動方式、指定描述作業的屬性,以及建立 ContributorInput。ContributorInput
此類別會將輸入資料儲存到 RefactoringContributor。 如果您的主要參與者需要次要參與者來完成重構作業,您可能必須建立多個衍生自 ContributorInput 的類別。 例如,如果您要變更物件的名稱,除了修改物件本身外,還必須修改該物件的所有參考。 因此,您會為符號建立一個 ContributorInput,再為符號的所有參考建立另一個 ContributorInput。RefactoringContributor
此類別會根據指定的輸入建置變更提議清單。 如同 ContributorInput,您可能必須建立衍生自 RefactoringContributor 的多個類別。 如果您需要次要 ContributorInput,主要 RefactoringContributor 會建立該輸入。 您必須宣告與您的重構參與者相容的「資料庫結構描述提供者」(Database Schema Provider)。 您也必須註冊重構類型的所有參與者和重構命令。
資料庫重構目標
您可以擴充已註冊的重構類型來處理新目標,例如新的模型項目類型或新檔案。 若要讓重構處理新目標,您必須建立新的重構參與者。 新的參與者必須能夠處理該重構類型的其中一個已定義 ContributorInput。 建立新重構目標或參與者的方式是實作繼承自下列基底類別的至少一個類別:
- RefactoringContributor
此類別會根據指定的輸入建置變更提議清單。 您必須宣告與重構參與者相容的資料庫結構描述提供者,而且必須註冊重構類型的所有參與者。