しばやん雑記

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

ASP.NET vNext(MVC / Web API / Web Pages 6, Entity Framework 7, SignalR 3)が TechEd NA で発表された話

開発者向けと銘打った Build 2014 では大した情報が出てこなかったのに、TechEd North America 2014 でどう考えても開発者向けとしか思えない情報がたくさん出てくる現象に名前を付けたい。

1 日目のキーノートでは Azure 周りに大量のアップデートが入り、No.1 に「しねる」とまで言わせました。

Azure Updateいろいろ | ブチザッキ

とりあえず Web サイトに関しては目立ったアップデートが無くてほっとしました。ASP.NET と Azure IaaS 周りの人たちは de:code に向けて頑張ってもらいたい所存(鬼

とまあ、Azure 周りはこれぐらいにして本題の ASP.NET vNext についてですが、TechEd NA 2 日目の最初のセッションで Scott Hunter と Scott Hanselman という豪華な 2 人により発表されました。これまで Project K という名前で開発が進められていたもので、誤解を恐れずに言うと Roslyn を使ってコンパイルから実行までを行う新しいランタイム上で動作する ASP.NET といった感じでしょうか。

関係する情報へのリンクをまとめておいたので、一通り眺めておいた方が良いと思います。

内容を適当に要約してみると、以下のような感じになるのかなと思いました。

  • ASP.NET MVC / Web API / Web Pages は MVC 6 として統合される
    • MVC 6 は System.Web への依存関係はないので、System.Web の機能を使いたい場合には MVC 5 が最後になるっぽい
  • MVC 6, SignalR 3, Entity Framework 7 はクラウドに最適化されたバージョンになる
    • 何をもって最適化というと、side-by-side でのデプロイが行えて GAC にもはや依存しないところ(コピーするだけで動く)
    • cs ファイルのコンパイルは不要、Roslyn が実行時にコンパイルする
  • 今までは IIS にベッタリだったのが、IIS に依存しなくなった
    • セルフホストで普通に動くし、IIS でも Helios を使うことにより動かせる
    • Mono 上でのホスティングも考慮されているように思える (klr.mono.managed.dll とか)
  • Dependency Injection がフレームワークの機能として提供される
    • Microsoft.Framework.DependencyInjection 名前空間、Autofac / Ninject / StructureMap / Unity に対応する予定みたい
  • OWIN っぽいインターフェース (IBuilder / RequestDelegate とか) を実装している
    • 残念ながら OWIN との互換は UseOwin しないとダメっぽい/(^o^)\
  • packages.config が消滅し、project.json に依存するコンポーネントの情報とかを定義する
    • k コマンドで使えるサブコマンドの定義とか出来ます

既に ASP.NET vNext に関しては GitHub にてソースコードが全て公開されているのと、MyGet で必要なライブラリが配布されているので clone すれば試すことが出来るようになっています。

ASP.NET MVC / Web API / Web Pages 周り

さらっと重要なことをブログに書いてました。

  • MVC / Web API / Web Pages merge, using a common set of abstractions for HTTP, routing, action selection, filters, model binding, and so on
  • No System.Web, new lightweight HttpContext
ASP.NET vNext: the future of .NET on the Server - .NET Web Development and Tools Blog - Site Home - MSDN Blogs

Web API がリリースされた時に MVC とクラス名が被りまくって生きるのが辛くなった記憶がありますが、HTTP / ルーティング / アクションの選択 / フィルター / モデルバインディング諸々が共通化されてシンプルになったみたいです。素晴らしい、実に素晴らしい。

DI が標準で入ったので、MVC 6 ではいろんな部分が DI 使うようになっています。UseService では DI の設定を行うほげほげだったみたいですね。

public class Startup
{
    public void Configure(IBuilder app)
    {
        app.UseServices(services =>
        {
            services.AddMvc();
        });

        app.UseMvc();
    }       
}

確かデモでは AddMvc メソッドの呼び出しをコメントアウトしたら、サーバが起動しなくなるというのがあった気がします。

そういえば、ActionResult と ActionFilter は Task ベースの非同期になったみたいですね。

K 周り

今回のリリースから色んな用語が増えてきましたので軽くまとめます。

  • K Runtime (KRE)
    • ASP.NET vNext で作られたアプリケーションのブートストラッパー
    • Roslyn を使ったコンパイル、実際に CLR 上で動かすことまでが役割
  • KVM
    • K Version Manager、K Runtime のバージョン管理を行うもの。rbenv に似てる
  • KPM
    • K Package Manager、NuGet ベースでアプリケーションに必要なパッケージを管理
  • Core CLR
    • フルの .NET 4.5 をコンパクトにし、side-by-side 可能にしたもの(多分)

ちなみに Core CLR をインストールすると、ものすごい量の dll がディレクトリに展開されます。

f:id:shiba-yan:20140514215447p:plain

aspnet/Home · GitHub の Getting Started の通りにコマンドを打ち込むと Core CLR ではなく .NET 4.5 で動くランタイムがインストールされるので、-svrc50 スイッチを付けると Core CLR 版がインストールされます。

kvm install 0.1-alpha-build-0421 -svrc50

svr はサーバ、c は Core CLR を指しているとかなんとか。50 は .NET 5.0 という意味になるんでしょうか、ちょっと分かりません。

ちなみに NuGet ベースで色々なパッケージがダウンロードされますが、GAC を使わないようになっているので大量のパッケージが落ちてきます。

f:id:shiba-yan:20140514212156p:plain

ただし、このパッケージが使われるのはフレームワークが K10 の時、つまり Core CLR がランタイムとして選択されているときに使われるようになっています。今までの .NET Framework 4.5 の時には必要なものだけ使われるみたいです。

デモでは k コマンドを使ってセルフホストばかりやっていましたが、IIS で実際にホストする場合には Helios を使って行うみたいです。MusicStore サンプルには Helios を使って起動するためのコマンドが用意されているので、それを引っ張ってきました。

SET KRE_HOME=%USERPROFILE%\.kre\

REM copy the AspNet.Loader.dll to the bin folder
call CopyAspNetLoader.cmd

"%ProgramFiles(x86)%\iis Express\iisexpress.exe"  /port:5001 /path:"%cd%"

AspNetLoader.dll というのは Helios のことです。bin ディレクトリにコピーしてしまえば、後は Helios が package.json とかを読み込んでアプリケーションを起動してくれるみたいですね。

とりあえず今回はランタイム周りのリリースしかなかったので、このぐらいにしておきます。次は kproj が開ける Visual Studio がリリースされたらブログ書くかもしれません。