しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Core / Entity Framework Core 2.2 と Cosmos DB SDK の改善

書く気力がほぼ無かったんですけど、Cosmos DB の .NET SDK がついに OSS になったのを記念して書きます。.NET Core 3.0 とか Visual Studio 2019 は詳しい人が何か書くはず。

とりあえずブチザッキと ufcpp.net を読んでおけば大体は掴めます。

Preview 3 の時に気になった部分だけ調べたこともあるので参考にしてください。

タイトルの通り ASP.NET Core 2.2 周りと Cosmos DB SDK について少しだけ調べました。

ASP.NET Core 2.2

アップデート内容からはパフォーマンス改善が目立ちます。IIS や App Service (Windows) でホストしている場合や、HttpClient をたくさん使っている場合には飛びつきたくなるような内容です。

2.1 から 2.2 には互換性に影響する変更はないはずなので、サクッとアップデートしても良さそうです。

手順としては TFM を netcoreapp2.2 に変更して、PackageReference での Microsoft.AspNetCore.App のバージョン確認、そして MVC の CompatibilityVersion を変えるぐらいのようです。

ASP.NET Core 2.2 から Microsoft.AspNetCore.App などをバージョン指定で参照している場合、ビルド時に警告が出るようになりました。

NETSDK1071 A PackageReference to 'Microsoft.AspNetCore.App' specified a Version of `2.2.0`. Specifying the version of this package is not recommended. For more information, see https://aka.ms/sdkimplicitrefs

2.1 から Version を省略した場合には、自動で適切なバージョンが選ばれるようになっているので、csproj から Version を消せばこの警告は消えます。

<PackageReference Include="Microsoft.AspNetCore.App" />

ビルド環境と実行環境で .NET Core のバージョンがきっちりあっていないと問題が起こりそうですが、最近は roll-forward で実行環境側が新しくなってからビルド環境のアップデートを行えばよいのかも。気になっているので、ちゃんと確認したい気持ちがあります。

ちなみに App Service には既に .NET Core 2.2 がインストールされているので、TFM などを修正してビルドし直せば良いはずですが、まだ ANCM v2 がインストールされていないので csproj に以下のプロパティを追加する必要があります。

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <AspNetCoreModuleName>AspNetCoreModule</AspNetCoreModuleName>
    <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
  </PropertyGroup>

この辺りはリリースのブログにも書いてあるのですが、最後の方で見落としやすそうだったので。

App Service では .NET Core 2.2 から 64bit ランタイムもインストールされるようになったので、Azure Portal から 64bit プロセスを選べば 64bit の .NET Core が使われるはずです。

Entity Framework Core 2.2

Cosmos DB 向けの Provider は 2.2 では見送りになりました。3.0 での対応を予定しているみたいです。世の中的には Query Tags が評判良さそうな感じでした。

それよりも 3.0 では Entity Framework 6.3 を .NET Core に移行する予定があるらしいです。個人的には推奨したくないですが、ASP.NET から ASP.NET Core への移行時には役立つかもしれません。

Cosmos DB SDK

古い Cosmos DB SDK は Full .NET と .NET Core で NuGet パッケージが異なっていたり、そもそものクラス設計がいまいちだったりで使いにくい記憶しかなかったです。

今回プレビューとしてリリースされた v3 SDK は JS SDK とほぼ同じ構造になったようです。*1

ちゃんと v3 は .NET Standard 2.0 として実装されているので、1 パッケージで Full .NET と .NET Core に対応出来ます。これまでは csproj で分岐させたり地味に辛かったです。

これまでの DocumentClient を使った場合よりも CosmosClient を使った方が API が直感的で分かりやすくなってます。実装としては DocumentClient のラッパーみたいになってるようですが、この辺りは将来的に古いコードを捨ててほしさあります。

古い SDK が OSS に出来なかった理由だと思っている Direct モードですが、v3 では別のパッケージにすることで対応したようです。まだ未対応の機能も多いですが、有望な SDK だと思います。

*1:メインの開発者が JS 版の人だからという理由