使用ASP.NET CORE開發可載入套件的基礎架構

Likol Lee
Likol Lee
Nov 3 · 4 min read

前言

在.NET 4.0的版本我利用上傳壓縮檔到網站的方式,來達到網站功能的新增、更新或移除,壓縮檔上傳後即會解開內容佈署至對應的目錄中,由於網站是依賴著IIS在執行,所以當網站內的程式有所異動時,將會立即重新啟動,新的功能也就隨即更新上去。

這種功能的佈署方式,一直到現在還是運作得相當不錯,仍有專案是採用這樣的方式來進行更新。每一次更新時只需要專注於要更新的部分,大大的降低更新後的不安心感。

在.NET CORE 剛推出時,了解到可以跨平台執行後,我就持續的在關注何時該進場進行轉換,一直到了Razor Pages的推出,我認為時機成熟了才開始投入時間進行相關技術的研究。

ASP.NET CORE 2.2

一開始我使用了v2.2來開始進行開發,馬上就了解到整個運行的架構與.NET Framework的不同,無法透過檔案複製的方式來增加功能,網站在啟動建構(Construction)時就已經將相關的功能(Application Parts)載入,因此無法簡單透過上傳檔案進行更新。

經過了一連串的研究後,發現在網站啟動(Startup)時可以自行將需要的功能載入,先使用AssemblyLoadContext讀取所需的組件,然後再透過Application​Part​Manager就可以將功能載入。

NuGet Package

一開始的設定是使用壓縮檔(.zip)來包裝套件內容,透過自訂MSBuild Task 來讀取JSON內容並在專案建置完成後進行套件壓縮檔的建立。

後來為了要將一些共用的組件進行整理,架設了Private NuGet Server進行管理,突然發現如果可以將套件的內容發佈到NuGet Server上,一方面開發時可用來進行開發階段的參考,一方面又可以做為功能的發佈,這樣似乎是一個不錯的好點子。

在Package中增加了一個"Platform"目錄,包含了一個manifest.json檔案,用來描述該如何載入這個套件的相關資訊。套件的載入又可分為兩種模式:

  1. 本地端目錄: 將套件放置於網站ContentRootPath中的Packages目錄
  2. JSON定義檔: 定義讀取的NuGet Server URI與套件名稱版本

ASP.NET CORE 3.0

很快的3.0 正式推出,由於在Startup的DI機制上做了一些調整,只好又重新改寫了一次,這次將整個Configure的機制調整得更簡單。

Startup.cs

[延伸閱讀]

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade