Azure Function .Net Core Line Bot

Azure Function & EF Core & LintBot 實例 -1

陳勇勳 2019/11/21 11:43:36
1148

本主題以 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/

 

陳勇勳