構思與初步驗證
構想來源
這樣的架構其實是來自於Microsoft的產品"SharePoint",除了可以使用官方提供的專屬軟體直接進行客製化,官方也在Visual Studio中開發了延伸套件,讓開發人員可以更深層的進行客製化,使用Visual Studio所開發的客製化功能,就是使用套件方式進行佈署。
找出方法
在.NET Core剛推出時,由於已經在ASP.NET上實現了這樣的架構,因此並沒有立即就針對.NET Core的版本進行開發,一直到了.NET Core 3.0版本推出才決定要在.NET Core實現這樣的作法。
一開始就意識到由於ASP.NET與ASP.NET Core已經是完全不同的架構,在ASP.NET的實作方式已經無法使用,過程中只能不斷的深入探索ASP.NET Core的運作方式,藉以找出可實現的方式。
終於當越來越了解運作原理後,從ASP.NET Core Identity UI功能找到了可以從外部組件載入頁面功能的正確做法,但卻發現了一個實現這項架構的更大挑戰。
深入問題
問題在於使用.NET Core開發的程式都會產生一個.deps.json檔案,檔案會紀錄程式啟動時需要載入的組件資訊,開發階段加入參考的組件自動就會產生相關資訊。而要達到使用套件方式載入功能的架構,可能會因為需要載入的套件有額外參考其他組件,但額外參考的組件資訊並沒有包含在啟動的.deps.json中,因此造成無法運作。當然更不可能將所有可能用到的組件都在開發階段就加入啟動專案的參考中,這樣就完全破壞了這種架構的意義,
經過不斷的嘗試與查看GitHub中.NET Core的程式碼,意外的發現有一個類別名稱"DependencyContext"是用來讀取這個檔案的,它也提供一個方法稱為"Merge"可以合併不同的.deps.json,這樣就可以處理執行階段啟動時載入套件的依據。
另一個問題則是找出專案建置時是如何輸出.deps.json,因為必須在建置階段將參考的組件檔案加入到套件的內容中。這個部分應該是需要從.NET Core SDK進行下手,找出專案的建置過程(MSBuild)是哪個部分輸出這個檔案的內容,觀察整合專案建置詳細紀錄後發現,"ReferencesCopiedInThisBuild"變數應該就是要找的目標。