メニュー

Rate this page:

Thanks for rating this page!

We are always striving to improve our documentation quality, and your feedback is valuable to us. How could this documentation serve you better?

C#およびASP.NET MVCを使用した予約リマインダー

アプリケーションにアポイントメントリマインダーを実装する準備はできましたか?アポイントリマインダーが高レベルでどのように機能するのかを以下に示します。

  1. 管理者は、将来の日時に対するアポイントメントを作成し、そのアポイントメント用に顧客の電話番号をデータベースに保存します。
  2. バックグラウンドプロセスは、データベースを定期的にチェックし、リマインダーを送信する必要があるアポイントメントを探します。
  3. アポイントメントより前の設定済み時間に、アポイントメントを思い出させるために SMS リマインダーが顧客に送信されます。

Yelpが飲食店に対してレストランの予約確認に、いかにしてSMSを使用しているのか見てみましょう。

ビルディングブロック

これを行うために使用するテクノロジーは以下のとおりです。

  • データベースドリブンのウェブアプリケーションを作成するためのASP.NET MVC
  • Messages Resource:Twilio の REST API からテキストメッセージを送信します。
  • バックグラウンドタスクを反復的にスケジュールおよび実行するためのHangfire

このチュートリアルの読み方

予約リマインダーを実装するため、Webアプリケーション内で予約リマインダーをもれなく実装する方法について述べられた一連のユーザーストーリーに取り組みます。 各ストーリーの要件を満たすために必要なコードについて見ていき、各ステップで何を追加すべきかについて調べます。

これはTwilioの助けを借りれば30分以内で完了できます。

はじめましょう!

アポイントメントの作成

ユーザーとして、名前、ゲスト電話番号、および将来の時間を使ってアポイントメントを作成します。

自動アポイントメントリマインダーアプリケーションを構築するには、ほとんどの場合アポイントメントから始めます。このストーリーでは、システムで新しい Appointment を作成および保存するために、UI およびモデルオブジェクトを多少作成する必要があります。追加する必要があるのは、おおまかに以下のとおりです。

  • アポイントメントに関する詳細を入力するためのフォーム
  • フォームをレンダリングするためのサーバー上のルートおよびコントローラー関数
  • フォーム POST リクエストを処理するためのサーバー上のルートおよびコントローラー関数
  • ユーザーに関する情報を保存するための永続的な Appointment モデルオブジェクト

これで申し分ないでしょう。 新規アプリケーションの作成に必要なものが把握できました。 まずは、予約にどのような情報を保存すべきかについて決定するためのモデルについて見ていきましょう。

予約モデルを確認する

アポイントメントモデル

アポイントメントモデルはかなり明快ですが、人間がかかわるので、データ検証を追加しておきましょう。

アプリケーションは ASP.NET Data Annotations を利用しています。今回は、一部のフィールドが必須であることを検証するだけにとどめます。これを実現するには、[Required] データアノテーションを使います。

既定では、ASP.NET MVCはコントロールのレンダリング時に、プロパティー名を表示します。 今回のサンプルでは、これらのプロパティー名はNameまたはPhoneNumberになります。 Nameのレンダリングに関しては問題はないでしょう。 しかしPhoneNumberに関しては、「Phone Number」のようなもう少し見やすく表示にした方が良いでしょう。 このようなシナリオでは別の、 [Display(Name = "Phone Number")] といったデータ注釈が使用できます。

PhoneNumber フィールドの内容を検証するために、[Phone] データアノテーションを使って、ユーザーが入力した電話番号が E.164 フォーマット基準にほぼ準拠していることを確認しています。

        
        
        
        
        AppointmentReminders.Web/Models/Appointment.cs

        アポイントメントモデル

        AppointmentReminders.Web/Models/Appointment.cs

        これで予約モデルが定義されました。 それでは、管理者が新規予約を作成できるようにするためのフォームを見てみましょう。

        新規の予約フォームを確認する

        新規アポイントメントフォーム

        新しいアポントメントを作成する際は、ゲスト名、電話番号、時刻が必要です。HTML Helper クラスを使って、モデルオブジェクトにフォームをバインドできます。これらのヘルパーにより、必要な HTML マークアップが生成され、送信時に新しいアポイントメントが作成されます。

              
              
              
              
              AppointmentReminders.Web/Views/Appointments/_Form.cshtml

              新規予約フォーム

              AppointmentReminders.Web/Views/Appointments/_Form.cshtml

              これでモデルとUIが用意できたので、Appointmentsとのインタラクション方法を見ておきましょう。

              予約のインタラクション方法を確認しておく

              アポイントメントとのインタラクション

              ユーザーとして、今後のすべてのアポイントメントのリストを表示するとともに、 これらのアポイントメントを削除できるようにします。

              大量のアポイントメントを扱う組織の場合は、おそらくそれらのアポイントメントを単一のインターフェイスで表示および管理できるようにしたいと考えるでしょう。このユーザーストーリーでは、それに取り組みます。以下の操作を行う UI を作成します。

              • すべてのアポイントメントを表示する
              • 個々のアポイントメントを削除する

              We know what interactions we want to implement, so let's look first at how to list all upcoming Appointments.

              予約を一覧するコントローラーを確認する

              Getting a List of Appointments

              コントローラーレベルで、データベース内のすべてのアポイントメントのリストを取得し、ビューでレンダリングします。また、アポイントメントがない場合に、admin ユーザーが作成できるよう、メニューも追加します。

                    
                    
                    
                    
                    AppointmentReminders.Web/Controllers/AppointmentsController.cs

                    全予約を一覧する

                    AppointmentReminders.Web/Controllers/AppointmentsController.cs

                    これが予約一覧を返す方法です。 さて、これをレンダリングしましょう。 そのための予約テンプレートを見てみましょう。

                    予約テンプレートにアクセスし、一覧を表示する方法を確認する

                    全予約の表示

                    インデックスビューではID順にソートされた全予約が一覧されます。 ユーザーストーリーを全うするのために追加が必要なのは、削除ボタンだけです。 余興として編集ボタンも追加しましょう。

                    HTML ヘルパー

                    「編集」および「削除」用のURLをハードコーディングするのではなく、ASP.NET MVC HTMLヘルパーを使用していることにお気づきかもしれません。 レンダリング済みのマークアップを確認すれば、これらのパスがご覧いただけるでしょう。

                    • /Appointments/Edit/id (編集の場合)
                    • /Appointments/Delete/id 削除

                    AppointmentsController.cs 編集と削除両方の操作を処理するメソッドが含まれます。

                          
                          
                          
                          
                          AppointmentReminders.Web/Views/Appointments/Index.cshtml

                          全予約を表示する

                          AppointmentReminders.Web/Views/Appointments/Index.cshtml

                          これで予約の作成、表示、編集、および削除ができるようになったので、いよいよここからお楽しみパートです: 予約が近づいてきたらリマインダーをSMS経由で送信する繰り返しジョブをスケジューリングしましょう。

                          What's needed to send SMS reminders?

                          リマインダーの送信

                          アポイントメントシステムとして、今後のアポイントメントの前に、任意の間隔で SMS を介してユーザーに通知します。

                          アプリケーションのこの部分を構築する方法は数多くありますが、その実装方法に関係なく、2 つの可動部分が存在する必要があります。

                          • 近く予定されているアポイントメントがないかデータベースをチェックした後、SMS を送信するスクリプト。
                          • このスクリプトを連続して実行するワーカー。

                          では、Hangfire で後者の実装をどのように決定したかを見てみましょう。

                          Hangfireに慣れる

                          Hangfire の操作

                          以前にスケジュールしたジョブをまったく使っていない場合は、ASP.NET MVC でバックグラウンドタスクを実行するためのいくつかの方法を示した Scott Hanselman によるこの投稿を参照してください。Hangfire は、シンプルなので、使うことにしました。 ASP.NET MVC でジョブをスケジュールするためのもっと良い方法があれば、お知らせください

                          Hangfireでは、近く予定されているジョブを待ち行列に追加するための何らかのバックエンドが必要です。 今回の実装ではSQL Serverデータベースを使用しますが、他のデータストアを使用することもできます。 さらなる詳細については、ドキュメントを参照してください。

                                
                                
                                
                                
                                AppointmentReminders.Web/packages.config

                                Hangfireの依存関係

                                AppointmentReminders.Web/packages.config

                                Now that we have included Hangfire dependencies into the project, let's take a look at how to configure it to use it in our appointment reminders application.

                                Hangfireの構成ページにアクセスする

                                Hangfire の設定クラス

                                ジョブスケジューラーを設定するために、Hangfire という名前のクラスを作成しました。このクラスは、2 つのスタティックメソッドを定義します。

                                1. ConfigureHangfire ジョブスケジューラーの初期化パラメーターを設定する。
                                2. InitialzeJobs どの反復ジョブをどの程度の頻度で実行するかを指定する。
                                      
                                      
                                      
                                      
                                      AppointmentReminders.Web/App_Start/Hangfire.cs

                                      Hangfireを構成する

                                      AppointmentReminders.Web/App_Start/Hangfire.cs

                                      構成は以上になります。 次はジョブスケジューラーを起動する方法を少し見てみましょう。

                                      ジョブスケジューラーの起動

                                      ジョブスケジューラーの起動

                                      この ASP.NET MVC プロジェクトは OWIN ベースのアプリケーションで、アプリケーションで必要となるカスタムな初期化ロジックを実行するための起動クラスを作成できます。Hangfire を起動するには、これは望ましい場所です。詳細については、設定ドキュメントを参照してください

                                            
                                            
                                            
                                            
                                            AppointmentReminders.Web/Startup.c

                                            Hangfireを開始する

                                            AppointmentReminders.Web/Startup.c

                                            これでジョブスケジューラーが起動されたので、ジョブが実行されたときに実行されるロジックを確認しておきましょう。

                                            通知バックグラウンドジョブを確認する

                                            通知バックグラウンドジョブ

                                            このクラスでは、1 分ごとに Hangfire で呼び出される Execute という名前のメソッドを定義します。ジョブが実行されるたびに、以下が必要になります。

                                            1. 通知の送信を必要とする近く予定されているアポイントメントのリストを取得する
                                            2. Twilio を使い、アポイントメントリマインダーを SMS を介して送信する

                                            AppointmentsFinder クラスは、SQL Server データベースに問い合わせ、近く予定されているすべてのアポイントメントを探します。このようなアポイントメントごとに、Twilio REST API を使って、フォーマット化されたメッセージを送信します。

                                                  
                                                  
                                                  
                                                  
                                                  AppointmentReminders.Web/Workers/SendNotificationsJob.cs

                                                  通知のバックグラウンドジョブ

                                                  AppointmentReminders.Web/Workers/SendNotificationsJob.cs

                                                  これで近い将来の予約の一覧が取得できましたので、Twilioを使用してSMS通知を送信する方法を見ていきましょう。

                                                  Let's use Twilio to send some notifications by SMS

                                                  Twilio REST API リクエスト

                                                  このクラスは Twilio アカウントクレデンシャルを Web.config から読み取り、Twilio REST API を使って実際に通知をユーザーに送信します。テキストメッセージの送信者として使う Twilio 番号も必要です。実際にメッセージを送信するのはは、たった 1 行のコードです。

                                                        
                                                        
                                                        
                                                        
                                                        AppointmentReminders.Web/Domain/Twilio/RestClient.cs

                                                        TwilioでSMSを送信する

                                                        AppointmentReminders.Web/Domain/Twilio/RestClient.cs

                                                        楽しいチュートリアルだったしょう? ここから先はどうしましょうか?

                                                        関連トピック

                                                        次はどこでしょうか?

                                                        多少のコードとわずかな設定で、自動アポイントメントリマインダーをアプリケーションで起動できます。お疲れ様でした。

                                                        If you are a C# developer working with Twilio, you might want to check out other tutorials:

                                                        クリック トゥー コール

                                                        ウェブページのボタンを押して、電話を介して訪問者をライブサポートまたはセールス担当者に接続します。

                                                        二要素認証

                                                        テキストメッセージを介した二要素認証を追加することで、Flask アプリのログイン機能のセキュリティを強化します。

                                                        これは役に立ちましたか?

                                                        Thanks for checking out this tutorial! If you have any feedback to share with us, please reach out on Twitter... we'd love to hear your thoughts, and know what you're building!

                                                        Agustin Camino Hector Ortega Andrew Baker David Prothero Kat King
                                                        Rate this page:

                                                        ヘルプが必要ですか?

                                                        We all do sometimes; code is hard. Get help now from our support team, or lean on the wisdom of the crowd browsing the Twilio tag on Stack Overflow.