Skip to content

架構與平台邊界 ​

本頁包含各產品專案的分層、依賴方向,以及為什麼走平台原生補全管線。 改 .cs 之前的硬規則見程式碼護欄。

產品專案 ​

專案目標相依職責
SqlAssist.Corenetstandard2.0無詞法、剖析、排名、設定模型、SQL Memory 契約與宿主協調;純邏輯
SqlAssist.Metadatanetstandard2.0System.Data中繼資料查詢、模型與快取
SqlAssist.SqlMemory.Sqlitenetstandard2.0Core、SQLiteSQL Memory 的 SQLite 交易與查詢
SqlAssist.SqlMemory.Isolationnet48Sqlite隔離 AppDomain 載入 SQLite,與 SSMS 內建的 provider 分開
SqlAssist.Ssms22net48SSMS 組件、IsolationMEF、命令、視窗、設定與編輯器接線

分層只問:這段邏輯是否需要 SSMS 才跑得起來? 不需要就放 Core 或 Metadata, 需要才放 Ssms22,而且薄到只剩取得服務、掛事件與套用結果。

SqlCompletionTriggers 是樣板:Core 判斷文字與游標,Ssms22 只在正確時機呼叫並轉成 OpenOrUpdate。SqlInsertionText 也曾因共用型別放錯到 Ssms22;把不碰資料庫的識別字 括號化移回 Core 後,整條插入規則才重新可測。SQL Memory 同理:開關、世代、故障恢復與排程 在 Core/SqlMemory/SqlMemoryRuntime,Ssms22 只讀設定、建立計時器與顯示通知。 放置位置由相依決定,不由現址決定。

為什麼使用平台原生補全管線 ​

SSMS 的 T-SQL IntelliSense 是舊版語言服務,官方文件沒有保證新版 async completion API 會套用到 ContentType "SQL",因此先實機量測再決定。SSMS 22.9.12105.275 確認 GetOrCreate 與 InitializeCompletion 都會收到按鍵;建立 TextView 當下 IsCompletionSupported 回報 False 只是建議來源尚未實例化的時序結果。

自製 WPF 清單無法根治三件事:與內建清單同時出現、只能靠鍵盤操作、反覆 DismissAllSessions 搶 session,所以改走原生管線,分成三個 MEF 匯出:

匯出職責
IAsyncCompletionSource項目與說明面板
IAsyncCompletionItemManager排名、篩選與命中標示;只轉接,規則在 Core/Completion/SuggestionList
IAsyncCompletionCommitManager提交、接續建議與語句展開

排名器不能省:平台預設比對器沒有詞首感知,否則 libr 排不到 Lib_Reader。 逐次診斷由「設定 → SqlAssist → 診斷 → 寫入詳細診斷紀錄」開啟。

以 Apache-2.0 授權條款發布 · 專為 SSMS 22 設計