Azure Function & EF Core & LintBot 實例 -1
本主題以 Azure Function 範本為專案主體框架,其次結合 EntityFrameWorkCore 做為與資料庫溝通橋樑,實現LineBot功能上的資料傳輸讀寫動作.
(由於使用至少三個不同應用,其某些非必要原理部分只能以實例方式帶過,想要深入的朋友,文末最後會放上各個參考連結)
=============================================================================
建立 Azure Function
STEP 1 創建專案
本範例使用Azure Function v2 ,範本框架採用 Empty
儲存體帳戶 (AzureWebJobsStorage):可選擇 "無"、"儲存體模擬器"、"瀏覽",本機運行狀況可先選擇"無",後續發佈Azure時可另外設定
Access rights: 新版更名為 Autorization Level,指的是建立預設Function時,會代入Function層級的Autorization參數
補充:
Azure Function RunTime總共區分兩種
V1是搭配 .NET Framework 因此只能在 Windows環境上運作
V2是搭配 .NET Standard 可以跨平台運作
STEP 2 新增Azure Function 函數檔案
於專案中自行建立一個放置azure function .cs 檔的資料夾,接著滑鼠右鍵 -> 新增Azure 函數
Azure 函數提供很多種不同的Template使用,本範例採用 Http Trigger
建立完成後,會產生一個帶有[FunctionName]屬性宣告的方法 Run (範例為實際開發功能,故與預設方法略有不同)
補充:
[FunctionName("Name")] : Name 為外部呼叫Route API 對應的名稱
[HttpTrigger(AuthorizationLevel 授權等級, HTTP呼叫方式, Route=外部呼叫API別名)]
授權等級:
Anonymous: 無須API金鑰,任何知道URL的人都可以存取
Function: 需要函數專屬的API金鑰
Admin: 需要管理員金鑰
STEP 3 使用PostMan進行呼叫測試
上述步驟建立完專案後,就要先進行初步的呼叫測試
先按下F5運行專案
看到上圖代表Azure Function專案初步建立成功
範例中我們建立另一個Azure Function,給予 Route別名為: missions
這裡使用PostMan方式進行 https://www.getpostman.com/
結合 EntityFrameCore DbContext
前言
Azure Function V2 主要支援EF Core,但核心並無提供DI注入相關函式
因此要使用 DI 注入技巧的話,必須自行建立相關類別
STEP 1 安裝 nuget 套件
於專案中加入圖中相關套件
其中 Willezone.Azure.WebJobs.Extensions.DependencyInjection為 DI 注入功能主要套件
(範例版本與最新版本可能有落差,請自行參照各套件相依安裝即可)
STEP 2 建立 DbContext
自行建立一個類別為 HeavenDbContext
有寫過 .net core 的朋友對 DbContext 應該不陌生,主要就是繼承 DbContext 物件
DbSet<T>: 可視為一個資料的實體
可自行建立多個實體給予EF使用
STEP 3 local.setting.json檔案設定
在創建完azure function專案後,會出現一個local.setting.json檔案,這就是 azure function 於localhost時對應的設定檔
補充:
FUNCTIONS_WORKER_RUNTIME: 設定主要的編譯器,這裡選用dotnet
CORS:設定跨域讀取限制,這裡設定 * (此設定只對 localhost開發時有效,放置於server上需要額外設定)
SqlConnectionString: 可設定連接到Azure Sql Database 或者本機資料庫
其他註解參數例如 ChannelAccessToken、Room、Group、Push則是個人自訂的屬性
用於發佈 Azure 後供以內部程式使用 (如下圖)
使用"發佈"功能,設定完azure 設定檔後,就可以看到相關應用程式設定
STEP 4 建立 DI 注入設定類別 ServiceProviderBuilder
上述步驟檔案都建立完成後,這個步驟就是真正要將所有檔案進行"註冊動作"
建立一個 ServiceProviderBuilder類別,並繼承 IServiceProviderBuilder
IServiceProviderBuilder是什麼?
前文提到 Azure Function 雖然支援EF Core,但並不支援DI注入,因此需安裝 Willezone.Azure.WebJobs.Extensions.DependencyInjection套件
IServiceProviderBuilder 就是套件提供的介面,讓我們可自行註冊DI相關物件
建立 IServiceProvider回傳方法 Build() ,這邊基本分三小塊說明
取得 local.settings.json 檔案,並且轉化成 IConfigurationRoot 物件,目的在於接下來設定資料庫連線時,導入連線字串使用
當想在Azure Function函式中使用特定DI Service時,必須先將這些Service class 加入到 ServiceCollection物件中
補充:
service.AddSingleton 這行程式碼主要為 AutoMapper 套件引用注入檔案相依
services.AddDbContext<T> 註冊 EF Core 重點物件DbContext
圖中可看到config.GetConnectionString("SqlConnectionString") ,config也就是 local.settings.json 檔案轉化後的物件
取得其 SqlConnectionString 屬性當作連線字串
最後執行return service.BuildServiceProvider 到此DbContext 與 DI Serivce註冊動作算是告一段落.
Return? 那又是誰呼叫Build()呢?
我們在建立 azure function 專案後,會產生一個 Startup.cs 檔案
ServiceProviderBuilder物件就是在這一開始即被執行
=========================================
此篇主題到此告一段落,整體原理或是概念並沒有特別深入說明
對於.net core使用熟悉的人,並不會太過於陌生.
有興趣的人可以自行往相關方向研究
Azure Function建立方式 & 結合 EF Core為主軸
其他主題如:
Azure Function發佈 Azure雲端平台方式
結合後 LineBot 進行遠端偵錯方法
則留在後續文章中提及.
文章如果有誤歡迎指正,感謝您的閱讀.
參考連結:
Azure Function:
官方介紹
https://azure.microsoft.com/zh-tw/services/functions/
官方文件
https://docs.microsoft.com/zh-tw/azure/azure-functions/functions-host-json
EF Core:
Azure Function With EF Core
https://dibranmulder.github.io/2018/08/23/Azure-functions-V2-with-EF-Core/