銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

.NET サポートが追加された Azure MobileServices で Dapper を使ってDBアクセスする

ついに、 Azure Mobile Services のサーバーサイドで .NET がサポートされました!!!!!!111

Xamarinによるクライアントサイドがプラットフォーム問わずに C# で書けるようになったのになぜかサーバーサイドは Node.js のままだったわけですが、本日のアップデートでついに.NETで記述できるようになりました。MobileServices も含めての本日のアップデート一覧は安心と信頼のこちらでどうぞ。

Azure ExpressRouteとかいろいろUpdate « ブチザッキ

とりあえず、.NET でやる方法も上の記事を参考にしてもらえればいいかと思います。で、サンプルおよび初期用としてダウンロードできるプロジェクトなんですが、DBアクセスには Microsoft Recommendedな Entity Framework が使われています。が、ここはあえて謎社で使われている dapper という軽量ORMを使ってみたいと思います。*1

それでは、まずControllerを追加してみましょう。 Cotrollers フォルダ以下に最初からある TodoItemController は TableController というものを継承しています。これは内部でEntityFramework を使い簡単なCRUDをサポートした抽象クラスです*2。なので、これとは別に通常の ASP.NET Web API 同様 ApiController を継承したコントローラークラスを新規に追加します。

UserDeviceQuery というのが Dapperを使ったクエリを行うクラスでこれから作成します。また、[RequiresAuthorization(AuthorizationLevel.Anonymous)] は認証なしでアクセス可能にするために必要です。何も属性つけないと、Mobile ServiceのAplicationKey を知っているユーザーとしてのアクセスが必要になります。

で、肝心のDapperを使ってクエリを投げることにします。まず、Nuget から「Dapper dot net」を追加します。そして次のようなクラスを作成します。

UserDevice クラスはDBのテーブルと対応するPOCOです。で、 UserDeviceQuery でとりあえず全件取得するクエリを発行しています。「MS_TableConnectionString」という名前の接続文字列はデフォルトで設定される接続文字列の名前です。

さて、Dapperを使う場合、DBのテーブルはあらかじめ作成しておく必要があります。EntityFrameworkのCodeFirstによるテーブル作成・変更は使えません*3。今までのNode.jsで作成した場合は Azure Portalからテーブル変更ができたのですが、.NET版だとなくなっているので、直接SQL Serverに接続して作業します。今回は Visual Studioのサーバーエクスプローラーから接続します。

f:id:tanaka733:20140221215308p:plain

SQLデータベースを右クリックして、SQL Server オブジェクト エクスプローラーで開きます。ここからテーブルを作るわけですが、今回はすでに作ってあるMobile Servicesのテーブル定義をもとに作成しました。以下にSQL文を載せておきます。(を自分のMobileServicesの名前に変えてください)

ついでに数件データを追加しておきましょう。

これで準備完了です。ポータルのページから発行プロファイルをダウンロードしてVisual Studioから発行します。

f:id:tanaka733:20140221221126p:plain

発行するとこんなトップページが表示されます。かっこいいですね。

で、追加したAPIにアクセスすると、データを取得できます。

f:id:tanaka733:20140221221321p:plain

おそらくMobileServicesの推奨はEntityFrameworkで、今後も便利メソッドなどの提供があると思われますが、お好きなテクノロジを使ってDBアクセスすることができそうです。C# で書けるようになったことでもっと別の処理もお手軽に記述できるようになったので引き続き調べていこうと思います。

*1:個人的にORMそこまで好きじゃないし、Code FirstによるDB変更も好きじゃないし...

*2:また、TableControllerを継承すると /tables/<Controllerの名前> というパスでアクセスすることになります

*3:先に書いたように、私はあまりやりたくない