こんにちは、サイオステクノロジーの佐藤 陽です。
今回は、Azure FunctionsのプロジェクトにおいてSendGridをDI(Dependency Injection)する方法をご紹介します。
はじめに
メール送信機能を実現するにあたり、SendGridを採用することも多いのではないでしょうか?
今回はそんなSendGridをAzureFunctions上でDIを使って実装していきたいと思います。
なお今回、
- SendGridアカウントの調達
- Azure Functions上でのDI基盤整備
の2点はブログの範囲外とします。
これらの準備が整ったうえでご覧ください
SendGridClientのDI
SendGridはDIをサポートしており、SendGridのClientをInjectionすることができます。
.NETの環境におけるDIの実装に関しては、コチラにもサンプルコードが記載されています。
ただ、恐らくこれはASP.NET Coreのサンプルコードであり、Azure Functionsのプロジェクトにはそのまま適用できなさそうです。
少し探してみたのですが、Azure FunctionsのプロジェクトにおけるDIの実装に関しては、あまり情報が見つからなかったので備忘録として書き留めておきます。
Startupクラスの整備
Azure FunctionsのプロジェクトにおけるDIの実装に関しては、公式のドキュメントにもに記載があります。
また、手っ取り早く実装方法を知りたい方は、こちらのブログもおすすめです。
では、Startupクラスを作成してある前提で話を進めていきます。
先ほどのドキュメントにも書かれているのですが、SendGridのDIは
HttpClientFactory + Microsoft.Extensions.DependencyInjection
という形で実装されています。
どうやらベースとしては、HttpClientFactoryが利用されているようです。
それではまず、必要となるExtensionを取得しましょう。
dotnet add package SendGrid
dotnet add package SendGrid.Extensions.DependencyInjection
ちなみに今回利用したバージョンは以下の通りです。
- SendGrid:9.28.1
- SendGrid.Extensions.DependencyInjection:1.0.1
実装としては、HttpClientFactoryのケースとほぼ同じです。
Startup.csクラス
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using SendGrid.Extensions.DependencyInjection;
using System;
[assembly: FunctionsStartup(typeof(sendgridsample.Startup))]
namespace sendgridsample
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSendGrid(options =>
{
options.ApiKey = Environment.GetEnvironmentVariable("SendGridApiKey");
});
}
}
}
Functionクラスの整備
Startupクラスの整備が完了したので、実際にメールを飛ばす実装を書いていきます。
関数クラスにおいて、コンストラクタインジェクションでSendGridClientを受け取ります。
ここまで出来てしまえば、あとはSDKの送信メソッドを呼ぶだけです。
実装クラス
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using SendGrid;
using SendGrid.Helpers.Mail;
using System.Net;
using System.Threading.Tasks;
namespace sendgridsample
{
public class Function1
{
private readonly ISendGridClient _sendGridClient;
public Function1(ISendGridClient sendGridClient)
{
_sendGridClient = sendGridClient;
}
[FunctionName("Function1")]
public async Task<HttpStatusCode> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
EmailAddress from = new("from@hoge.com");
var subject = "subject";
EmailAddress to = new("to@hoge.com");
string plainTextBody = "hogehoge";
SendGridMessage message = MailHelper.CreateSingleEmail(from, to, subject, plainTextBody, string.Empty);
Response response = await _sendGridClient.SendEmailAsync(message);
return response.StatusCode;
}
}
}
実行
SendGridのDIおよびメール送信機能が実装できました。
早速プロジェクトを実行します。
と表示されるので、以下のエンドポイントを実行します。
[GET,POST] http://localhost:7033/api/Function1
するとメールが届いてるのを確認できました。
(※メールアドレスはサンプルコードから変更してあります。)
まとめ
今回はAzure Functionsのプロジェクトにおいて、SendGridのClientをDIする方法をご紹介しました。
SendGrid自体がDIをサポートしていたため、簡単に実装を行うことができました
みなさんもぜひ活用してみてくださいね。