【C#】Azure FunctionsでSendGridをDIする方法を紹介!

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【5/21開催】Azure OpenAI ServiceによるRAG実装ガイドを公開しました
生成AIを活用したユースケースで最も一番熱いと言われているRAGの実装ガイドを公開しました。そのガイドの紹介をおこなうイベントです!!
https://tech-lab.connpass.com/event/315703/

こんにちは、サイオステクノロジーの佐藤 陽です。
今回は、Azure FunctionsのプロジェクトにおいてSendGridをDI(Dependency Injection)する方法をご紹介します。

はじめに

メール送信機能を実現するにあたり、SendGridを採用することも多いのではないでしょうか?
今回はそんなSendGridをAzureFunctions上でDIを使って実装していきたいと思います。

なお今回、

  1. SendGridアカウントの調達
  2. 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をサポートしていたため、簡単に実装を行うことができました
みなさんもぜひ活用してみてくださいね。

アバター画像
About 佐藤 陽 52 Articles
ロードバイクやトレランなど、走ることが好きなサーバーサイドエンジニア。組み込み系からWeb系へとジョブチェンジし、現在はAzureを使ったWebアプリの開発や、DevOpsの構築を行っています。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる